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 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-08-29 09:46:25 +02:00
parent d4ce5f62ee
commit dfaf5ccc58

View File

@@ -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.")