# Open Food Facts → lokaler EAN-Katalog

## Zweck

Dieses Dokument beschreibt die Transformationsmethode, mit der der lokale EAN-/GTIN-Katalog des KH-Kompasses aus dem offiziellen Open-Food-Facts-Datenexport erzeugt wird. Es wird als öffentlich zugängliche Beschreibung der Änderungen an der Quelldatenbank bereitgestellt.

Der lokale, aus Open Food Facts abgeleitete Katalog wird unter der **Open Database License (ODbL) 1.0** behandelt.

- Quelle: https://world.openfoodfacts.org/data
- Export: https://static.openfoodfacts.org/data/en.openfoodfacts.org.products.csv.gz
- ODbL 1.0: https://opendatacommons.org/licenses/odbl/1-0/

## Eingabe

Der offizielle tab-separierte globale Open-Food-Facts-Export.

## Übernommene Felder

Aus jedem Datensatz werden ausschließlich folgende Felder übernommen:

1. `code` → EAN/GTIN
2. `product_name`
3. `generic_name`
4. `brands`
5. `quantity`
6. `serving_size`
7. `carbohydrates_100g`
8. `fat_100g` (für die eindeutige Anzeige des Fettgehalts, insbesondere bei Milchprodukten)
8. `carbohydrates_serving`
9. `countries`
10. `categories`
11. `url`
12. `stores`
13. `image_url` bzw. `image_small_url`

Open-Food-Facts-Produktbilder und deren Bild-URLs werden nicht in die Nutzeransicht übernommen. Katalogprodukte erhalten lokale Kategorie-SVGs. Nur Bilder, die ein Nutzer selbst zu einem persönlichen Lebensmittel hochlädt, werden angezeigt.

## Normalisierung

- Aus `code` werden alle Nicht-Ziffern entfernt.
- Datensätze mit leerer Kennung oder weniger als 6 bzw. mehr als 18 Ziffern werden verworfen.
- Textwerte werden getrimmt. Tabulatoren und Zeilenumbrüche werden in Leerzeichen umgewandelt und mehrfache Leerzeichen zusammengeführt.
- Textfelder werden auf definierte Maximallängen begrenzt.
- Dezimalzahlen dürfen Punkt oder Komma enthalten und werden intern mit Punkt gespeichert.
- Nicht numerische oder nicht endliche Nährwertangaben werden als leerer Wert gespeichert.

## Ausgabeformat

Die normalisierten Datensätze werden in einer getrennten SQLite-Datenbank gespeichert. `catalog_products` enthält die Produktfelder, ein eindeutiger Index auf `ean` ermöglicht direkte Scanner-Abfragen und `catalog_products_fts` stellt die lokale Volltextsuche bereit. Metadaten zum Import und zu registrierten JSON-Quelldateien liegen in `catalog_meta` und `catalog_source_files`.

Die Anwendung öffnet diesen Katalog mit `PRAGMA query_only = ON`. Nutzerinhalte, Favoriten und persönliche Lebensmittel liegen in einer separaten Anwendungsdatenbank und können den OFF-Katalog nicht verändern.

## Dubletten

Falls dieselbe EAN mehrfach im Import vorkommt, wird sie über den eindeutigen EAN-Schlüssel zusammengeführt. Der zuletzt verarbeitete gültige Datensatz aktualisiert den vorhandenen Eintrag.

## Keine zusätzlichen OFF-Inhalte

Der aus Open Food Facts erzeugte Katalog enthält durch diese Transformation keine zusätzlich erfundenen Produktdaten. Eigene Basiswerte oder manuell erfasste Einträge der Anwendung werden getrennt von diesem OFF-Katalog verwaltet und sind nicht Bestandteil dieser Transformationsbeschreibung.

## Reproduzierbarer Algorithmus

Das veröffentlichte SQLite-Schema (`app/catalog_schema.sql`) und diese Beschreibung dokumentieren Struktur und Transformation. Der vollständige Import wird serverseitig durch `scripts/migrate_food_catalog_to_sqlite.php` ausgeführt.
