diff --git a/index/categories_nutriments_per_country.world.sto b/index/categories_nutriments_per_country.world.sto deleted file mode 100644 index 51f6769488450..0000000000000 Binary files a/index/categories_nutriments_per_country.world.sto and /dev/null differ diff --git a/lib/ProductOpener/Display.pm b/lib/ProductOpener/Display.pm index ed59b036a3328..45fb908f11df0 100644 --- a/lib/ProductOpener/Display.pm +++ b/lib/ProductOpener/Display.pm @@ -8853,8 +8853,14 @@ sub data_to_display_nutriscore_and_nutrient_levels($) { # Missing nutrition facts? if (has_tag($product_ref,"misc","en:nutriscore-missing-nutrition-data")) { push @nutriscore_warnings, lang("nutriscore_missing_nutrition_data"); - $result_data_ref->{nutriscore_unknown_reason} = "missing_nutrition_data"; # Takes precedence if the category is also missing - $result_data_ref->{nutriscore_unknown_reason_short} = lang("nutriscore_missing_nutrition_data_short"); + if (not has_tag($product_ref,"misc","en:nutriscore-missing-category")) { + $result_data_ref->{nutriscore_unknown_reason} = "missing_nutrition_data"; + $result_data_ref->{nutriscore_unknown_reason_short} = lang("nutriscore_missing_nutrition_data_short"); + } + else { + $result_data_ref->{nutriscore_unknown_reason} = "missing_category_and_nutrition_data"; + $result_data_ref->{nutriscore_unknown_reason_short} = lang("nutriscore_missing_category_and_nutrition_data_short"); + } } } } diff --git a/lib/ProductOpener/Food.pm b/lib/ProductOpener/Food.pm index 9f18e67a082cd..8cad2ba0893cc 100644 --- a/lib/ProductOpener/Food.pm +++ b/lib/ProductOpener/Food.pm @@ -1472,13 +1472,22 @@ my %fruits_vegetables_nuts_by_category = ( my @fruits_vegetables_nuts_by_category_sorted = sort { $fruits_vegetables_nuts_by_category{$b} <=> $fruits_vegetables_nuts_by_category{$a} } keys %fruits_vegetables_nuts_by_category; +=head2 compute_nutrition_score( $product_ref ) + +Determines if we have enough data to compute the Nutri-Score (category + nutrition facts), +and if the Nutri-Score is applicable to the product the category. + +Populates the data structure needed to commpute the Nutri-Score and computes it. + +=cut + sub compute_nutrition_score($) { my $product_ref = shift; # Initialize values - delete $product_ref->{nutrition_score_debug}; + $product_ref->{nutrition_score_debug} = ''; delete $product_ref->{nutriments}{"nutrition-score"}; delete $product_ref->{nutriments}{"nutrition-score_100g"}; delete $product_ref->{nutriments}{"nutrition-score_serving"}; @@ -1504,8 +1513,6 @@ sub compute_nutrition_score($) { delete $product_ref->{nutriscore_data}; delete $product_ref->{nutriscore_points}; - defined $product_ref->{misc_tags} or $product_ref->{misc_tags} = []; - $product_ref->{misc_tags} = ["en:nutriscore-not-computed"]; my $prepared = ''; @@ -1513,19 +1520,16 @@ sub compute_nutrition_score($) { # do not compute a score when we don't have a category if ((not defined $product_ref->{categories}) or ($product_ref->{categories} eq '')) { $product_ref->{"nutrition_grades_tags"} = [ "unknown" ]; - $product_ref->{nutrition_score_debug} = "no score when the product does not have a category"; + $product_ref->{nutrition_score_debug} = "no score when the product does not have a category" . " - ";; add_tag($product_ref,"misc","en:nutriscore-missing-category"); - return; } if (not defined $product_ref->{nutrition_score_beverage}) { $product_ref->{"nutrition_grades_tags"} = [ "unknown" ]; - $product_ref->{nutrition_score_debug} = "did not determine if it was a beverage"; + $product_ref->{nutrition_score_debug} = "did not determine if it was a beverage" . " - ";; add_tag($product_ref,"misc","en:nutriscore-beverage-status-unknown"); - return; } - # do not compute a score for dehydrated products to be rehydrated (e.g. dried soups, powder milk) # unless we have nutrition data for the prepared product # same for en:chocolate-powders, en:dessert-mixes and en:flavoured-syrups @@ -1535,16 +1539,15 @@ sub compute_nutrition_score($) { if (has_tag($product_ref, "categories", $category_tag)) { if ((defined $product_ref->{nutriments}{"energy_prepared_100g"})) { - $product_ref->{nutrition_score_debug} = "using prepared product data for category $category_tag"; + $product_ref->{nutrition_score_debug} = "using prepared product data for category $category_tag" . " - ";; $prepared = '_prepared'; - last; } else { $product_ref->{"nutrition_grades_tags"} = [ "unknown" ]; - $product_ref->{nutrition_score_debug} = "no score for category $category_tag without data for prepared product"; + $product_ref->{nutrition_score_debug} = "no score for category $category_tag without data for prepared product" . " - ";; add_tag($product_ref,"misc","en:nutriscore-missing-prepared-nutrition-data"); - return; } + last; } } @@ -1569,8 +1572,8 @@ sub compute_nutrition_score($) { if (has_tag($product_ref, "categories", $category_id)) { $product_ref->{"nutrition_grades_tags"} = [ "not-applicable" ]; add_tag($product_ref,"misc","en:nutriscore-not-applicable"); - $product_ref->{nutrition_score_debug} = "no nutriscore for category $category_id"; - return; + $product_ref->{nutrition_score_debug} = "no nutriscore for category $category_id" . " - ";; + last; } } } @@ -1589,14 +1592,10 @@ sub compute_nutrition_score($) { foreach my $nid ("energy", "fat", "saturated-fat", "sugars", "sodium", "proteins") { if (not defined $product_ref->{nutriments}{$nid . $prepared . "_100g"}) { $product_ref->{"nutrition_grades_tags"} = [ "unknown" ]; - push @{$product_ref->{misc_tags}}, "en:nutrition-not-enough-data-to-compute-nutrition-score"; - if (not defined $product_ref->{nutriments}{"saturated-fat" . $prepared . "_100g"}) { - push @{$product_ref->{misc_tags}}, "en:nutrition-no-saturated-fat"; - } - $product_ref->{nutrition_score_debug} .= "missing " . $nid . $prepared; + add_tag($product_ref,"misc","en:nutrition-not-enough-data-to-compute-nutrition-score"); + $product_ref->{nutrition_score_debug} .= "missing " . $nid . $prepared . " - "; add_tag($product_ref,"misc","en:nutriscore-missing-nutrition-data"); add_tag($product_ref,"misc","en:nutriscore-missing-nutrition-data-$nid"); - return; } } @@ -1607,10 +1606,20 @@ sub compute_nutrition_score($) { and (not defined $product_ref->{nutriments}{"fiber" . $prepared . "_modifier"}) and not (has_tag($product_ref, "categories", "en:sodas"))) { $product_ref->{nutrition_score_warning_no_fiber} = 1; - push @{$product_ref->{misc_tags}}, "en:nutrition-no-fiber"; + add_tag($product_ref,"misc","en:nutrition-no-fiber"); } } + # Remove ending - + $product_ref->{nutrition_score_debug} =~ s/ - $//; + + # If the Nutri-Score is unknown or not applicable, exit the function + if ((defined $product_ref->{"nutrition_grades_tags"}) + and (($product_ref->{"nutrition_grades_tags"}[0] eq "unknown") + or ($product_ref->{"nutrition_grades_tags"}[0] eq "not-applicable"))) { + return; + } + if ($prepared ne '') { push @{$product_ref->{misc_tags}}, "en:nutrition-grade-computed-for-prepared-product"; } diff --git a/lib/ProductOpener/KnowledgePanels.pm b/lib/ProductOpener/KnowledgePanels.pm index b33dcfc6d3322..ea2e9d98b1f08 100644 --- a/lib/ProductOpener/KnowledgePanels.pm +++ b/lib/ProductOpener/KnowledgePanels.pm @@ -522,18 +522,20 @@ sub create_ecoscore_panel($$$) { # Create an extra panel for products that have extended ecoscore data from the impact estimator - if (defined $product_ref->{ecoscore_extended_data}) { + # 2022/05/06: disabled as we currently have few products with reliable extended ecoscore data - extract_data_from_impact_estimator_best_recipe($product_ref, $panel_data_ref); + # if (defined $product_ref->{ecoscore_extended_data}) { - compare_impact_estimator_data_to_category_average($product_ref, $panel_data_ref, $target_cc); + # extract_data_from_impact_estimator_best_recipe($product_ref, $panel_data_ref); - # Display a panel only if we can compare the product extended impact - if (defined $panel_data_ref->{ecoscore_extended_data_for_category}) { - create_panel_from_json_template("ecoscore_extended", "api/knowledge-panels/environment/ecoscore/ecoscore_extended.tt.json", - $panel_data_ref, $product_ref, $target_lc, $target_cc); - } - } + # compare_impact_estimator_data_to_category_average($product_ref, $panel_data_ref, $target_cc); + + # # Display a panel only if we can compare the product extended impact + # if (defined $panel_data_ref->{ecoscore_extended_data_for_category}) { + # create_panel_from_json_template("ecoscore_extended", "api/knowledge-panels/environment/ecoscore/ecoscore_extended.tt.json", + # $panel_data_ref, $product_ref, $target_lc, $target_cc); + # } + # } create_panel_from_json_template("carbon_footprint", "api/knowledge-panels/environment/carbon_footprint.tt.json", $panel_data_ref, $product_ref, $target_lc, $target_cc); @@ -784,17 +786,11 @@ sub create_nutriscore_panel($$$) { my $panel_data_ref = data_to_display_nutriscore_and_nutrient_levels($product_ref); - # Do not display the Nutri-Score panel if it is not applicable - if ((not $panel_data_ref->{do_not_display}) - and (not $panel_data_ref->{nutriscore_grade} eq "not-applicable")) { - - $panel_data_ref->{title} = lang_in_other_lc($target_lc, "attribute_nutriscore_" . $panel_data_ref->{nutriscore_grade} . "_description_short"); + $panel_data_ref->{title} = lang_in_other_lc($target_lc, "attribute_nutriscore_" . $panel_data_ref->{nutriscore_grade} . "_description_short"); - # Nutri-Score panel: score + details - create_panel_from_json_template("nutriscore", "api/knowledge-panels/health/nutriscore/nutriscore.tt.json", - $panel_data_ref, $product_ref, $target_lc, $target_cc); - - } + # Nutri-Score panel: score + details + create_panel_from_json_template("nutriscore", "api/knowledge-panels/health/nutriscore/nutriscore.tt.json", + $panel_data_ref, $product_ref, $target_lc, $target_cc); } diff --git a/lib/ProductOpener/Tags.pm b/lib/ProductOpener/Tags.pm index 06f14a47db61d..9be4afcb6caa4 100644 --- a/lib/ProductOpener/Tags.pm +++ b/lib/ProductOpener/Tags.pm @@ -356,6 +356,7 @@ sub is_a($$$) { } + sub add_tag($$$) { my $product_ref = shift; @@ -365,14 +366,14 @@ sub add_tag($$$) { (defined $product_ref->{$tagtype . "_tags"}) or $product_ref->{$tagtype . "_tags"} = []; foreach my $existing_tagid (@{$product_ref->{$tagtype . "_tags"}}) { if ($tagid eq $existing_tagid) { - return; + return 0; } } push @{$product_ref->{$tagtype . "_tags"}}, $tagid; - - return; + return 1; } + sub remove_tag($$$) { my $product_ref = shift; @@ -388,6 +389,9 @@ sub remove_tag($$$) { if ($tag ne $tagid) { push @{$product_ref->{$tagtype . "_tags_new"}}, $tag; } + else { + $return = 1; + } } $product_ref->{$tagtype . "_tags"} = $product_ref->{$tagtype . "_tags_new"}; delete $product_ref->{$tagtype . "_tags_new"}; diff --git a/lib/ProductOpener/Test.pm b/lib/ProductOpener/Test.pm index 4e47ee4246cf7..8aa08bd7be1dc 100644 --- a/lib/ProductOpener/Test.pm +++ b/lib/ProductOpener/Test.pm @@ -364,6 +364,7 @@ sub normalize_product_for_test_comparison($) { my $product = shift; # fields we don't want to check for they vary from test to test # stars means there is a table of elements and we want to run through all (hash not supported yet) + # compared_to_category: depends on which products have been aggregated in index/categories_nutriments_per_country.world.sto my @fields_ignore_content = qw( last_modified_t created_t owner_fields entry_dates_tags last_edit_dates_tags diff --git a/po/common/common.pot b/po/common/common.pot index 0d2752f21ebdb..ea8816ab2e0a4 100644 --- a/po/common/common.pot +++ b/po/common/common.pot @@ -5924,6 +5924,10 @@ msgctxt "nutriscore_missing_nutrition_data" msgid "The nutrition facts of the product must be specified in order to compute the Nutri-Score." msgstr "The nutrition facts of the product must be specified in order to compute the Nutri-Score." +msgctxt "nutriscore_missing_category_and_nutrition_data" +msgid "The category and the nutrition facts of the product must be specified in order to compute the Nutri-Score." +msgstr "The category and the nutrition facts of the product must be specified in order to compute the Nutri-Score." + msgctxt "health" msgid "Health" msgstr "Health" @@ -5980,6 +5984,10 @@ msgctxt "nutriscore_missing_nutrition_data_short" msgid "Missing nutrition facts" msgstr "Missing nutrition facts" +msgctxt "nutriscore_missing_category_and_nutrition_data_short" +msgid "Missing category and nutrition facts" +msgstr "Missing category and nutrition facts" + msgctxt "recommendation_who_reduce_or_stop_drinking_alcohol_title" msgid "Reduce or stop drinking alcohol" msgstr "Reduce or stop drinking alcohol" diff --git a/po/common/en.po b/po/common/en.po index 6180ec19a641c..512396852592e 100644 --- a/po/common/en.po +++ b/po/common/en.po @@ -5946,6 +5946,10 @@ msgctxt "nutriscore_missing_nutrition_data" msgid "The nutrition facts of the product must be specified in order to compute the Nutri-Score." msgstr "The nutrition facts of the product must be specified in order to compute the Nutri-Score." +msgctxt "nutriscore_missing_category_and_nutrition_data" +msgid "The category and the nutrition facts of the product must be specified in order to compute the Nutri-Score." +msgstr "The category and the nutrition facts of the product must be specified in order to compute the Nutri-Score." + msgctxt "health" msgid "Health" msgstr "Health" @@ -6002,6 +6006,10 @@ msgctxt "nutriscore_missing_nutrition_data_short" msgid "Missing nutrition facts" msgstr "Missing nutrition facts" +msgctxt "nutriscore_missing_category_and_nutrition_data_short" +msgid "Missing category and nutrition facts" +msgstr "Missing category and nutrition facts" + msgctxt "recommendation_who_reduce_or_stop_drinking_alcohol_title" msgid "Reduce or stop drinking alcohol" msgstr "Reduce or stop drinking alcohol" diff --git a/t/expected_test_results/attributes/en-attributes.json b/t/expected_test_results/attributes/en-attributes.json index 7ab7f16147bfc..32ed1c5af6766 100644 --- a/t/expected_test_results/attributes/en-attributes.json +++ b/t/expected_test_results/attributes/en-attributes.json @@ -1163,6 +1163,7 @@ "c" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 0, "other_nutritional_substances_tags" : [], diff --git a/t/expected_test_results/attributes/en-ecoscore-score-at-20-threshold.json b/t/expected_test_results/attributes/en-ecoscore-score-at-20-threshold.json index b1bf2d02691b3..0c8edbcaf8860 100644 --- a/t/expected_test_results/attributes/en-ecoscore-score-at-20-threshold.json +++ b/t/expected_test_results/attributes/en-ecoscore-score-at-20-threshold.json @@ -745,9 +745,14 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutrition-not-enough-data-to-compute-nutrition-score", - "en:nutrition-no-saturated-fat", "en:nutriscore-missing-nutrition-data", "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-missing-data-warning", "en:ecoscore-missing-data-labels", @@ -769,7 +774,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "missing energy", + "nutrition_score_debug" : "missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "other_nutritional_substances_tags" : [], "packagings" : [], "pnns_groups_1" : "unknown", diff --git a/t/expected_test_results/attributes/en-maybe-vegan.json b/t/expected_test_results/attributes/en-maybe-vegan.json index 5498d52535f10..0548a9def780d 100644 --- a/t/expected_test_results/attributes/en-maybe-vegan.json +++ b/t/expected_test_results/attributes/en-maybe-vegan.json @@ -686,9 +686,14 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutrition-not-enough-data-to-compute-nutrition-score", - "en:nutrition-no-saturated-fat", "en:nutriscore-missing-nutrition-data", "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-not-computed" ], @@ -724,7 +729,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "missing energy", + "nutrition_score_debug" : "missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "other_nutritional_substances_tags" : [], "packagings" : [], "pnns_groups_1" : "unknown", diff --git a/t/expected_test_results/attributes/en-nova-groups-markers.json b/t/expected_test_results/attributes/en-nova-groups-markers.json index 403c3940df31d..75ab4c8fbb513 100644 --- a/t/expected_test_results/attributes/en-nova-groups-markers.json +++ b/t/expected_test_results/attributes/en-nova-groups-markers.json @@ -914,9 +914,14 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutrition-not-enough-data-to-compute-nutrition-score", - "en:nutrition-no-saturated-fat", "en:nutriscore-missing-nutrition-data", "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-missing-data-warning", "en:ecoscore-missing-data-labels", @@ -983,7 +988,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "missing energy", + "nutrition_score_debug" : "missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "other_nutritional_substances_tags" : [], "packagings" : [], "pnns_groups_1" : "Milk and dairy products", diff --git a/t/expected_test_results/attributes/en-nutriscore.json b/t/expected_test_results/attributes/en-nutriscore.json index ade3e50bc550b..8a8c6956ec182 100644 --- a/t/expected_test_results/attributes/en-nutriscore.json +++ b/t/expected_test_results/attributes/en-nutriscore.json @@ -891,6 +891,7 @@ "b" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 100, "other_nutritional_substances_tags" : [], diff --git a/t/expected_test_results/attributes/fr-palm-kernel-fat.json b/t/expected_test_results/attributes/fr-palm-kernel-fat.json index cdac37fdc6ebe..065974914a302 100644 --- a/t/expected_test_results/attributes/fr-palm-kernel-fat.json +++ b/t/expected_test_results/attributes/fr-palm-kernel-fat.json @@ -652,6 +652,15 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutriscore-missing-category", + "en:nutrition-not-enough-data-to-compute-nutrition-score", + "en:nutriscore-missing-nutrition-data", + "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-not-computed" ], @@ -671,7 +680,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "no score when the product does not have a category", + "nutrition_score_debug" : "no score when the product does not have a category - missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "other_nutritional_substances_tags" : [], "packagings" : [], "pnns_groups_1" : "unknown", diff --git a/t/expected_test_results/attributes/fr-palm-oil-free.json b/t/expected_test_results/attributes/fr-palm-oil-free.json index b436dd39cd2ed..1a2ec2f58dae4 100644 --- a/t/expected_test_results/attributes/fr-palm-oil-free.json +++ b/t/expected_test_results/attributes/fr-palm-oil-free.json @@ -680,6 +680,15 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutriscore-missing-category", + "en:nutrition-not-enough-data-to-compute-nutrition-score", + "en:nutriscore-missing-nutrition-data", + "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-not-computed" ], @@ -699,7 +708,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "no score when the product does not have a category", + "nutrition_score_debug" : "no score when the product does not have a category - missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "other_nutritional_substances_tags" : [], "packagings" : [], "pnns_groups_1" : "unknown", diff --git a/t/expected_test_results/attributes/fr-palm-oil.json b/t/expected_test_results/attributes/fr-palm-oil.json index d6e18e6f17b3e..c78f1472d9011 100644 --- a/t/expected_test_results/attributes/fr-palm-oil.json +++ b/t/expected_test_results/attributes/fr-palm-oil.json @@ -668,6 +668,15 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutriscore-missing-category", + "en:nutrition-not-enough-data-to-compute-nutrition-score", + "en:nutriscore-missing-nutrition-data", + "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-not-computed" ], @@ -687,7 +696,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "no score when the product does not have a category", + "nutrition_score_debug" : "no score when the product does not have a category - missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "other_nutritional_substances_tags" : [], "packagings" : [], "pnns_groups_1" : "unknown", diff --git a/t/expected_test_results/attributes/fr-vegetable-oils.json b/t/expected_test_results/attributes/fr-vegetable-oils.json index 90541d4348372..051bf50d7257c 100644 --- a/t/expected_test_results/attributes/fr-vegetable-oils.json +++ b/t/expected_test_results/attributes/fr-vegetable-oils.json @@ -677,6 +677,15 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutriscore-missing-category", + "en:nutrition-not-enough-data-to-compute-nutrition-score", + "en:nutriscore-missing-nutrition-data", + "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-not-computed" ], @@ -696,7 +705,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "no score when the product does not have a category", + "nutrition_score_debug" : "no score when the product does not have a category - missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "other_nutritional_substances_tags" : [], "packagings" : [], "pnns_groups_1" : "unknown", diff --git a/t/expected_test_results/import_csv_file/3270190128403.json b/t/expected_test_results/import_csv_file/3270190128403.json index 87ff244687bda..99ec7abdd4030 100644 --- a/t/expected_test_results/import_csv_file/3270190128403.json +++ b/t/expected_test_results/import_csv_file/3270190128403.json @@ -380,9 +380,13 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutrition-not-enough-data-to-compute-nutrition-score", - "en:nutrition-no-saturated-fat", "en:nutriscore-missing-nutrition-data", "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber", "en:ecoscore-extended-data-not-computed", "en:ecoscore-not-computed", "en:main-countries-new-product" @@ -423,7 +427,8 @@ "unknown" ], "nutrition_score_beverage" : 0, - "nutrition_score_debug" : "missing fat", + "nutrition_score_debug" : "missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "origins" : "France", "origins_hierarchy" : [ "en:france" diff --git a/t/expected_test_results/ingredients/en-emulsifier-synonyms.json b/t/expected_test_results/ingredients/en-emulsifier-synonyms.json index c31bc42c96744..ff3f0fe31aba2 100644 --- a/t/expected_test_results/ingredients/en-emulsifier-synonyms.json +++ b/t/expected_test_results/ingredients/en-emulsifier-synonyms.json @@ -1,119 +1,119 @@ -{ - "ingredients" : [ - { - "id": "en:emulsifier", - "ingredients": [ - { - "from_palm_oil":"maybe", - "id" : "en:e471", - "percent_estimate" : 50, - "percent_max" : 100, - "percent_min" : 25, - "text" : "e471", - "vegan" : "maybe", - "vegetarian" : "maybe" - }, - { - "id" : "en:e477", - "percent_estimate" : 25, - "percent_max" : 50, - "percent_min" : 0, - "text" : "e477", - "vegan" : "maybe", - "vegetarian" : "maybe" - } - ], - "percent_estimate" : 75, - "percent_max" : 100, - "percent_min" : 50, - "text" : "Emulsifying" - }, - { - "id" : "en:stabiliser", - "ingredients" : [ - { - "id" : "en:e412", - "percent_estimate" : 12.5, - "percent_max" : 50, - "percent_min" : 0, - "text" : "e412", - "vegan" : "yes", - "vegetarian" : "yes" - }, - { - "id" : "en:e410", - "percent_estimate" : 12.5, - "percent_max" : 25, - "percent_min" : 0, - "text" : "e410", - "vegan" : "yes", - "vegetarian" : "yes" - } - ], - "percent_estimate" : 25, - "percent_max" : 50, - "percent_min" : 0, - "text" : "Stabilizing Agents" - } - ], - "ingredients_analysis" : { - "en:may-contain-palm-oil" : [ - "en:e471" - ], - "en:maybe-vegan" : [ - "en:e471", - "en:e477" - ], - "en:maybe-vegetarian" : [ - "en:e471", - "en:e477" - ] - }, - "ingredients_analysis_tags" : [ - "en:may-contain-palm-oil", - "en:maybe-vegan", - "en:maybe-vegetarian" - ], - "ingredients_hierarchy" : [ - "en:emulsifier", - "en:stabiliser", - "en:e471", - "en:e477", - "en:e412", - "en:e410" - ], - "ingredients_n" : 6, - "ingredients_n_tags" : [ - "6", - "1-10" - ], - "ingredients_original_tags" : [ - "en:emulsifier", - "en:stabiliser", - "en:e471", - "en:e477", - "en:e412", - "en:e410" - ], - "ingredients_percent_analysis" : 1, - "ingredients_tags" : [ - "en:emulsifier", - "en:stabiliser", - "en:e471", - "en:e477", - "en:e412", - "en:e410" - ], - "ingredients_text" : "Emulsifying (INS 471, INS 477) & Stabilizing Agents (INS 412, INS 410)", - "ingredients_with_specified_percent_n" : 0, - "ingredients_with_specified_percent_sum" : 0, - "ingredients_with_unspecified_percent_n" : 4, - "ingredients_with_unspecified_percent_sum" : 100, - "known_ingredients_n" : 6, - "lc" : "en", - "nutriments" : { - "fruits-vegetables-nuts-estimate-from-ingredients_100g" : 0, - "fruits-vegetables-nuts-estimate-from-ingredients_serving" : 0 - }, - "unknown_ingredients_n" : 0 - } +{ + "ingredients" : [ + { + "id" : "en:emulsifier", + "ingredients" : [ + { + "from_palm_oil" : "maybe", + "id" : "en:e471", + "percent_estimate" : 50, + "percent_max" : 100, + "percent_min" : 25, + "text" : "e471", + "vegan" : "maybe", + "vegetarian" : "maybe" + }, + { + "id" : "en:e477", + "percent_estimate" : 25, + "percent_max" : 50, + "percent_min" : 0, + "text" : "e477", + "vegan" : "maybe", + "vegetarian" : "maybe" + } + ], + "percent_estimate" : 75, + "percent_max" : 100, + "percent_min" : 50, + "text" : "Emulsifying" + }, + { + "id" : "en:stabiliser", + "ingredients" : [ + { + "id" : "en:e412", + "percent_estimate" : 12.5, + "percent_max" : 50, + "percent_min" : 0, + "text" : "e412", + "vegan" : "yes", + "vegetarian" : "yes" + }, + { + "id" : "en:e410", + "percent_estimate" : 12.5, + "percent_max" : 25, + "percent_min" : 0, + "text" : "e410", + "vegan" : "yes", + "vegetarian" : "yes" + } + ], + "percent_estimate" : 25, + "percent_max" : 50, + "percent_min" : 0, + "text" : "Stabilizing Agents" + } + ], + "ingredients_analysis" : { + "en:may-contain-palm-oil" : [ + "en:e471" + ], + "en:maybe-vegan" : [ + "en:e471", + "en:e477" + ], + "en:maybe-vegetarian" : [ + "en:e471", + "en:e477" + ] + }, + "ingredients_analysis_tags" : [ + "en:may-contain-palm-oil", + "en:maybe-vegan", + "en:maybe-vegetarian" + ], + "ingredients_hierarchy" : [ + "en:emulsifier", + "en:stabiliser", + "en:e471", + "en:e477", + "en:e412", + "en:e410" + ], + "ingredients_n" : 6, + "ingredients_n_tags" : [ + "6", + "1-10" + ], + "ingredients_original_tags" : [ + "en:emulsifier", + "en:stabiliser", + "en:e471", + "en:e477", + "en:e412", + "en:e410" + ], + "ingredients_percent_analysis" : 1, + "ingredients_tags" : [ + "en:emulsifier", + "en:stabiliser", + "en:e471", + "en:e477", + "en:e412", + "en:e410" + ], + "ingredients_text" : "Emulsifying (INS 471, INS 477) & Stabilizing Agents (INS 412, INS 410)", + "ingredients_with_specified_percent_n" : 0, + "ingredients_with_specified_percent_sum" : 0, + "ingredients_with_unspecified_percent_n" : 4, + "ingredients_with_unspecified_percent_sum" : 100, + "known_ingredients_n" : 6, + "lc" : "en", + "nutriments" : { + "fruits-vegetables-nuts-estimate-from-ingredients_100g" : 0, + "fruits-vegetables-nuts-estimate-from-ingredients_serving" : 0 + }, + "unknown_ingredients_n" : 0 +} diff --git a/t/expected_test_results/nutriscore/beverage-with-80-percent-milk.json b/t/expected_test_results/nutriscore/beverage-with-80-percent-milk.json index 7b96e17360380..eaa5a497a3a02 100644 --- a/t/expected_test_results/nutriscore/beverage-with-80-percent-milk.json +++ b/t/expected_test_results/nutriscore/beverage-with-80-percent-milk.json @@ -142,6 +142,7 @@ "d" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 0, "pnns_groups_1" : "unknown", diff --git a/t/expected_test_results/nutriscore/breakfast-cereals.json b/t/expected_test_results/nutriscore/breakfast-cereals.json index a206cca3beeff..34ddefe47c13e 100644 --- a/t/expected_test_results/nutriscore/breakfast-cereals.json +++ b/t/expected_test_results/nutriscore/breakfast-cereals.json @@ -97,6 +97,7 @@ "c" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_no_fruits_vegetables_nuts" : 1, "pnns_groups_1" : "Cereals and potatoes", "pnns_groups_1_tags" : [ diff --git a/t/expected_test_results/nutriscore/colza-oil.json b/t/expected_test_results/nutriscore/colza-oil.json index fa2a03a837b98..944903f4e40b9 100644 --- a/t/expected_test_results/nutriscore/colza-oil.json +++ b/t/expected_test_results/nutriscore/colza-oil.json @@ -98,6 +98,7 @@ "c" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_from_category" : "en:rapeseed-oils", "nutrition_score_warning_fruits_vegetables_nuts_from_category_value" : 100, "pnns_groups_1" : "Fat and sauces", diff --git a/t/expected_test_results/nutriscore/cookies.json b/t/expected_test_results/nutriscore/cookies.json index 6b53770180902..c97fcde2e3166 100644 --- a/t/expected_test_results/nutriscore/cookies.json +++ b/t/expected_test_results/nutriscore/cookies.json @@ -91,6 +91,7 @@ "e" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_no_fruits_vegetables_nuts" : 1, "pnns_groups_1" : "Sugary snacks", "pnns_groups_1_tags" : [ diff --git a/t/expected_test_results/nutriscore/dairy-drink-with-80-percent-milk.json b/t/expected_test_results/nutriscore/dairy-drink-with-80-percent-milk.json index f96fa0c0ab276..7c389471bc9bf 100644 --- a/t/expected_test_results/nutriscore/dairy-drink-with-80-percent-milk.json +++ b/t/expected_test_results/nutriscore/dairy-drink-with-80-percent-milk.json @@ -150,6 +150,7 @@ "d" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 0, "pnns_groups_1" : "Milk and dairy products", diff --git a/t/expected_test_results/nutriscore/dairy-drink-with-less-than-80-percent-milk.json b/t/expected_test_results/nutriscore/dairy-drink-with-less-than-80-percent-milk.json index cb09bfeb79021..876ea5f7621e6 100644 --- a/t/expected_test_results/nutriscore/dairy-drink-with-less-than-80-percent-milk.json +++ b/t/expected_test_results/nutriscore/dairy-drink-with-less-than-80-percent-milk.json @@ -147,6 +147,7 @@ "e" ], "nutrition_score_beverage" : 1, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 0, "pnns_groups_1" : "Beverages", diff --git a/t/expected_test_results/nutriscore/dairy-drinks-without-milk.json b/t/expected_test_results/nutriscore/dairy-drinks-without-milk.json index d68616bf80d6a..f8cd16b71a59e 100644 --- a/t/expected_test_results/nutriscore/dairy-drinks-without-milk.json +++ b/t/expected_test_results/nutriscore/dairy-drinks-without-milk.json @@ -141,6 +141,7 @@ "e" ], "nutrition_score_beverage" : 1, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 0, "pnns_groups_1" : "Beverages", diff --git a/t/expected_test_results/nutriscore/en-orange-juice-category-and-ingredients.json b/t/expected_test_results/nutriscore/en-orange-juice-category-and-ingredients.json index 29a11730b92c1..896aea9ef9b68 100644 --- a/t/expected_test_results/nutriscore/en-orange-juice-category-and-ingredients.json +++ b/t/expected_test_results/nutriscore/en-orange-juice-category-and-ingredients.json @@ -176,6 +176,7 @@ "e" ], "nutrition_score_beverage" : 1, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 50, "pnns_groups_1" : "Beverages", diff --git a/t/expected_test_results/nutriscore/en-orange-juice-category.json b/t/expected_test_results/nutriscore/en-orange-juice-category.json index 81ca947e2a2bb..3032091d82170 100644 --- a/t/expected_test_results/nutriscore/en-orange-juice-category.json +++ b/t/expected_test_results/nutriscore/en-orange-juice-category.json @@ -100,6 +100,7 @@ "c" ], "nutrition_score_beverage" : 1, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_from_category" : "en:fruit-juices", "nutrition_score_warning_fruits_vegetables_nuts_from_category_value" : 100, "pnns_groups_1" : "Beverages", diff --git a/t/expected_test_results/nutriscore/flavored-spring-water-no-nutrition.json b/t/expected_test_results/nutriscore/flavored-spring-water-no-nutrition.json index 34d437402f5db..1b7ccec0e6d6a 100644 --- a/t/expected_test_results/nutriscore/flavored-spring-water-no-nutrition.json +++ b/t/expected_test_results/nutriscore/flavored-spring-water-no-nutrition.json @@ -37,16 +37,22 @@ "misc_tags" : [ "en:nutriscore-not-computed", "en:nutrition-not-enough-data-to-compute-nutrition-score", - "en:nutrition-no-saturated-fat", "en:nutriscore-missing-nutrition-data", - "en:nutriscore-missing-nutrition-data-energy" + "en:nutriscore-missing-nutrition-data-energy", + "en:nutriscore-missing-nutrition-data-fat", + "en:nutriscore-missing-nutrition-data-saturated-fat", + "en:nutriscore-missing-nutrition-data-sugars", + "en:nutriscore-missing-nutrition-data-sodium", + "en:nutriscore-missing-nutrition-data-proteins", + "en:nutrition-no-fiber" ], "nutriments" : {}, "nutrition_grades_tags" : [ "unknown" ], "nutrition_score_beverage" : 1, - "nutrition_score_debug" : "missing energy", + "nutrition_score_debug" : "missing energy - missing fat - missing saturated-fat - missing sugars - missing sodium - missing proteins", + "nutrition_score_warning_no_fiber" : 1, "pnns_groups_1" : "Beverages", "pnns_groups_1_tags" : [ "beverages", diff --git a/t/expected_test_results/nutriscore/flavored-spring-with-nutrition.json b/t/expected_test_results/nutriscore/flavored-spring-with-nutrition.json index 499492fdaecc4..74476ef222f7e 100644 --- a/t/expected_test_results/nutriscore/flavored-spring-with-nutrition.json +++ b/t/expected_test_results/nutriscore/flavored-spring-with-nutrition.json @@ -93,6 +93,7 @@ "e" ], "nutrition_score_beverage" : 1, + "nutrition_score_debug" : "", "nutrition_score_warning_no_fruits_vegetables_nuts" : 1, "pnns_groups_1" : "Beverages", "pnns_groups_1_tags" : [ diff --git a/t/expected_test_results/nutriscore/fr-gaspacho.json b/t/expected_test_results/nutriscore/fr-gaspacho.json index bf686f4bc4981..3e44f2a36c8e0 100644 --- a/t/expected_test_results/nutriscore/fr-gaspacho.json +++ b/t/expected_test_results/nutriscore/fr-gaspacho.json @@ -293,6 +293,7 @@ "a" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 89, "pnns_groups_1" : "Fruits and vegetables", diff --git a/t/expected_test_results/nutriscore/milk.json b/t/expected_test_results/nutriscore/milk.json index e55a1b79d792e..e5e3030749e98 100644 --- a/t/expected_test_results/nutriscore/milk.json +++ b/t/expected_test_results/nutriscore/milk.json @@ -133,6 +133,7 @@ "d" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 0, "pnns_groups_1" : "Milk and dairy products", diff --git a/t/expected_test_results/nutriscore/mushrooms.json b/t/expected_test_results/nutriscore/mushrooms.json index 4cecd7fd8c60d..279311d869d8e 100644 --- a/t/expected_test_results/nutriscore/mushrooms.json +++ b/t/expected_test_results/nutriscore/mushrooms.json @@ -145,6 +145,7 @@ "a" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients" : 1, "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value" : 69, "pnns_groups_1" : "Composite foods", diff --git a/t/expected_test_results/nutriscore/olive-oil.json b/t/expected_test_results/nutriscore/olive-oil.json index 10c07dc180fb6..c33e6ce0f776f 100644 --- a/t/expected_test_results/nutriscore/olive-oil.json +++ b/t/expected_test_results/nutriscore/olive-oil.json @@ -100,6 +100,7 @@ "c" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_from_category" : "en:olive-oils", "nutrition_score_warning_fruits_vegetables_nuts_from_category_value" : 100, "pnns_groups_1" : "Fat and sauces", diff --git a/t/expected_test_results/nutriscore/spring-water-no-nutrition.json b/t/expected_test_results/nutriscore/spring-water-no-nutrition.json index e2e29df56069e..48666f25e24b7 100644 --- a/t/expected_test_results/nutriscore/spring-water-no-nutrition.json +++ b/t/expected_test_results/nutriscore/spring-water-no-nutrition.json @@ -84,6 +84,7 @@ "a" ], "nutrition_score_beverage" : 1, + "nutrition_score_debug" : "", "nutrition_score_warning_no_fruits_vegetables_nuts" : 1, "pnns_groups_1" : "Beverages", "pnns_groups_1_tags" : [ diff --git a/t/expected_test_results/nutriscore/sunflower-oil.json b/t/expected_test_results/nutriscore/sunflower-oil.json index f6b32bf253f99..234d6cb006180 100644 --- a/t/expected_test_results/nutriscore/sunflower-oil.json +++ b/t/expected_test_results/nutriscore/sunflower-oil.json @@ -99,6 +99,7 @@ "d" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_no_fruits_vegetables_nuts" : 1, "pnns_groups_1" : "Fat and sauces", "pnns_groups_1_tags" : [ diff --git a/t/expected_test_results/nutriscore/walnut-oil.json b/t/expected_test_results/nutriscore/walnut-oil.json index 1b5d15845dda0..055365454300b 100644 --- a/t/expected_test_results/nutriscore/walnut-oil.json +++ b/t/expected_test_results/nutriscore/walnut-oil.json @@ -102,6 +102,7 @@ "c" ], "nutrition_score_beverage" : 0, + "nutrition_score_debug" : "", "nutrition_score_warning_fruits_vegetables_nuts_from_category" : "en:walnut-oils", "nutrition_score_warning_fruits_vegetables_nuts_from_category_value" : 100, "pnns_groups_1" : "Fat and sauces", diff --git a/t/update_tests_results.sh b/t/update_tests_results.sh index cc22e463fcbc6..23d3c76c470d8 100755 --- a/t/update_tests_results.sh +++ b/t/update_tests_results.sh @@ -3,12 +3,19 @@ # Update the expected results with the content of the actual results # git diff can then be used to review the differences +# This script should be run only inside the po_backend_1 container + +# Remove the categories stats file as it will not be present +# for tests run through GitHub actions +rm /mnt/podata/data/categories_stats/categories_nutriments_per_country.world.sto + perl attributes.t --results expected_test_results/attributes/ perl ecoscore.t --results expected_test_results/ecoscore/ perl forest_footprint.t --results expected_test_results/forest_footprint/ perl import_gs1.t --results expected_test_results/import_gs1/ +perl import_csv_file.t --update-expected-results perl ingredients.t --results expected_test_results/ingredients/ -perl nutriscore.t --results expected_test_results/nutriscore/ +perl nutriscore.t --update-expected-results perl packaging.t --results expected_test_results/packaging/ perl recipes.t --results expected_test_results/recipes/ perl export.t --update-expected-results diff --git a/taxonomies/labels.result.sto b/taxonomies/labels.result.sto index 7096b8afdee7e..c3587ba64bba6 100644 Binary files a/taxonomies/labels.result.sto and b/taxonomies/labels.result.sto differ diff --git a/taxonomies/labels.result.txt b/taxonomies/labels.result.txt index 03f2a63a9de06..30a6a3f2973bf 100644 --- a/taxonomies/labels.result.txt +++ b/taxonomies/labels.result.txt @@ -17813,9 +17813,11 @@ cs:UTZ certifikováno de:UTZ Zertifiziert, UTZ es:Certificado UTZ fi:UTZ-sertifioitu, UTZ +fr:Certifié UTZ hu:UTZ Certified, UTZ, UTZ tanúsítás, UTZ tanúsítvány it:Certificato UTZ, UTZ nl:UTZ Gecertificeerd +xx:UTZ Certified auth_url:en: https://utz.org wikidata:en: Q2305872 @@ -18029,6 +18031,7 @@ hu:UTZ Certified Cocoa, UTZ Certified Cacao, UTZ tanúsított kakaó it:Cacao certificato UTZ nl:UTZ gecertificeerde cacao pl:UTZ Certified Cacao +xx:UTZ Certified Cocoa < en:UTZ Certified en:UTZ Certified Coffee @@ -18041,6 +18044,7 @@ hu:UTZ Certified Coffee, UTZ tanúsított kávé it:Caffè certificato UTZ, Caffe certificato UTZ nl:UTZ Certified Coffee pl:UTZ Certified Coffee +xx:UTZ Certified Coffee < en:Vegan en:EVE Vegan, Expertise Vegan Europe