"""Genauigkeit von Mindesthaltbarkeitsdaten. Auf vielen Verpackungen steht nur "09/2026" statt eines Tagesdatums. Damit die FEFO-Sortierung und alle Ablauf-Abfragen weiter mit einem echten DATE arbeiten können, wird ein solcher Monatswert auf den **Monatsletzten** gelegt – das ist die übliche Lesart bei Lebensmitteln. Wie genau die Angabe ursprünglich war, merkt sich die Charge zusätzlich in ``best_before_precision``; nur davon hängt ab, ob in der Anzeige "30.09.2026" oder "09/2026" steht. """ from __future__ import annotations from calendar import monthrange from datetime import date from ..models import DatePrecision DAY = DatePrecision.day.value MONTH = DatePrecision.month.value VALID_PRECISIONS = (DAY, MONTH) def normalize_best_before(value: date | None, precision: str | None) -> date | None: """Legt ein Monats-MHD auf den letzten Tag dieses Monats. Tagesgenaue Angaben und ``None`` bleiben unverändert. """ if value is None or precision != MONTH: return value return date(value.year, value.month, monthrange(value.year, value.month)[1]) def clean_precision(precision: str | None) -> str: """Unbekannte oder fehlende Angaben gelten als tagesgenau.""" return precision if precision in VALID_PRECISIONS else DAY