From dfaf5ccc58bd45e27db2243019aa56a6ebfdf6cd Mon Sep 17 00:00:00 2001 From: s4luorth Date: Sat, 29 Aug 2026 09:46:25 +0200 Subject: [PATCH] Fix: numbers-Filter nach distinkter Brief-Nummer statt Dateiposition Bei mehrseitigen Briefen war die Auswahl positionsbasiert ueber Dateien: 24 zwei- seitige Briefe = 48 Dateien, aber numbers=1-24 (Empfaengerzahl) behielt nur die ersten 24 Dateien (Briefe 1-12). Jetzt gruppiert der Filter nach distinkter Brief- Nummer (alle Seiten eines Briefs bleiben zusammen), robust gegen 0-/1-basierte Namen. Co-Authored-By: Claude Opus 4.8 --- agent.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/agent.py b/agent.py index 9809588..60cb6ac 100644 --- a/agent.py +++ b/agent.py @@ -184,6 +184,23 @@ def seiten_reihenfolge(files): return sorted(files, key=key) +def brief_nummer(name): + """Brief-Nummer aus dem Dateinamen: letter_001_p2.svg → 1, envelope_003.svg → 3. + + None, wenn nicht parsebar. Die Seite (_pN) wird ignoriert – alle Seiten eines + Briefs teilen sich dieselbe Nummer. + """ + rest = str(name or "").lower() + for pre in ("letter_", "envelope_", "kuvert_"): + if rest.startswith(pre): + rest = rest[len(pre):] + break + rest = rest.split(".")[0] + if "_p" in rest: + rest = rest.split("_p")[0] + return int(rest) if rest.isdigit() else None + + def main(): cfg = lade_config() dx = Directus(cfg["directus_url"], cfg["directus_token"]) @@ -357,12 +374,18 @@ def _job_dateien(dx, job, KIND): key=lambda f: f.get("name", ""), ) # Nur bestimmte Briefnummern drucken, falls im Job angegeben. - # Positionsbasiert (1 = erstes Dokument), NICHT über die Zahl im - # Dateinamen: Alt-Aufträge sind 0-basiert (letter_000.svg), neue - # 1-basiert (letter_001.svg). Die Position stimmt in beiden Fällen. + # Positionsbasiert über DISTINKTE Brief-Nummern (nicht über die Dateiposition!), + # damit mehrseitige Briefe komplett bleiben: 24 zweiseitige Briefe = 48 Dateien, + # numbers="1-24" wählt alle 24 Briefe → alle 48 Seiten. Robust gegen 0-/1-basierte + # Namen. Fallback auf die alte Dateiposition, falls keine Nummer parsebar ist. nummern = parse_nummern(job.get("numbers")) if nummern is not None: - passende = [f for i, f in enumerate(passende, start=1) if i in nummern] + distinkt = sorted({n for n in (brief_nummer(f.get("name")) for f in passende) if n is not None}) + if distinkt: + erlaubt = {distinkt[i - 1] for i in nummern if 1 <= i <= len(distinkt)} + passende = [f for f in passende if brief_nummer(f.get("name")) in erlaubt] + else: + passende = [f for i, f in enumerate(passende, start=1) if i in nummern] if not passende: raise RuntimeError(f"Keine Dateien vom Typ '{gewuenscht}' für {order_nr} gefunden.")