iOS: Name/Marke per Text scannen + Frischedatum ohne Jahr erkennen

- Neuer TextScanView: beim Anlegen Name und Marke per Texterkennung einlesen
  (erkannte Zeilen antippen, wie beim MHD-Scan) - kein Abtippen mehr, wenn ein
  Produkt nicht in Open Food/Products Facts steht.
- BestBeforeText erkennt jetzt auch Tag.Monat ohne Jahr (z.B. "05.01" bei
  Frischware / "zu verbrauchen bis") und ergaenzt das aktuelle Jahr (bzw. das
  naechste, falls schon vergangen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-29 14:35:46 +02:00
parent 18c07eaf3a
commit e42e11bf23
3 changed files with 167 additions and 0 deletions

View File

@@ -31,6 +31,10 @@ enum BestBeforeText {
(#"(\d{1,2})[./-](\d{4})"#, ["m", "y"], "month"),
(#"(\d{4})[./-](\d{1,2})(?!\d)"#, ["y", "m"], "month"),
(#"(\d{1,2})[./-](\d{2})(?!\d)"#, ["m", "Y"], "month"),
// Nur Tag und Monat, kein Jahr (z.B. 05.01" bei Frischware / zu
// verbrauchen bis"). Das Jahr ergänzt build(). Steht bewusst zuletzt,
// damit Muster mit Jahr Vorrang haben.
(#"(\d{1,2})[./-](\d{1,2})(?!\d)"#, ["d", "m"], "day"),
]
/// Alle plausiblen Daten aus einem Textstueck, in Fundreihenfolge und ohne Dubletten.
@@ -73,6 +77,18 @@ enum BestBeforeText {
jahr = vier
} else if let zwei = teile["Y"] {
jahr = 2000 + zwei
} else if precision == "day", let tag = teile["d"] {
// Kein Jahr aufgedruckt (Frischware): aktuelles Jahr annehmen; liegt
// das Datum schon in der Vergangenheit, das nächste Jahr nehmen.
let cal = Calendar.current
let aktuell = cal.component(.year, from: Date())
var probe = DateComponents()
probe.year = aktuell; probe.month = monat; probe.day = tag
if let d = cal.date(from: probe), d < cal.startOfDay(for: Date()) {
jahr = aktuell + 1
} else {
jahr = aktuell
}
} else {
return nil
}