fix(v3): '@' -> EM auch im Leitweg-Feld; BT-49-Info nennt beide Felder

- resolve_buyer_endpoint: das Schema wird jetzt am finalen Wert entschieden,
  egal aus welchem Feld er stammt. Ein '@' (auch versehentlich ins
  Leitweg-ID-Feld getippt) fuehrt immer zu Schema EM statt 0204.
- Der sichtbare Hinweis unter dem Schema-Feld benennt jetzt ausdruecklich
  beide Felder (Elektronische Adresse BT-49 UND Adress-Schema BT-49-1) mit
  ihren effektiven Werten, damit das leere BT-49-Feld nicht als "offen"
  missverstanden wird.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
dfuhrmann3 2026-07-14 15:24:56 +02:00
parent 2e259589c0
commit 23968bb911
2 changed files with 27 additions and 20 deletions

View File

@ -84,23 +84,26 @@ BUYER_ENDPOINT_SCHEMES = {
def resolve_buyer_endpoint(recipient_email, recipient_scheme, leitweg_id):
"""Ermittelt die effektive elektronische Adresse des Kaeufers (BT-49) samt Schema (BT-49-1).
Regeln (in dieser Reihenfolge):
1. Steht im BT-49-Feld eine Adresse mit '@', ist es immer eine E-Mail -> Schema 'EM'
(unabhaengig vom Dropdown, damit ein falsch gewaehltes Schema nicht durchschlaegt).
2. Steht dort eine Adresse ohne '@' (z.B. GLN), wird das gewaehlte Schema uebernommen.
3. Ist das Feld leer, aber eine Leitweg-ID (BT-10) vorhanden, wird die Leitweg-ID als BT-49
mit Schema '0204' verwendet - so muss die Leitweg-ID nur einmal (in BT-10) eingegeben werden.
4. Ist beides leer, bleibt die Adresse leer (Schema unveraendert).
Gibt (adresse, schema) zurueck."""
Zuerst wird der Wert bestimmt: das BT-49-Feld hat Vorrang; ist es leer, wird die Leitweg-ID
(BT-10) genommen (so muss sie nur einmal eingegeben werden). Dann das Schema:
1. Enthaelt der Wert ein '@', ist es immer eine E-Mail -> Schema 'EM' (egal aus welchem Feld
er stammt und unabhaengig vom Dropdown - ein falsch gewaehltes Schema schlaegt nicht durch).
2. Stammt der Wert aus der Leitweg-ID (BT-49-Feld war leer) -> Schema '0204'.
3. Sonst (Wert direkt in BT-49 eingetragen, ohne '@', z.B. GLN) -> das gewaehlte Schema.
Ist beides leer, bleibt die Adresse leer (Schema unveraendert). Gibt (adresse, schema) zurueck."""
email = str(recipient_email or "").strip()
if email:
if "@" in email:
return email, "EM"
return email, recipient_scheme
leitweg = str(leitweg_id or "").strip()
if leitweg:
return leitweg, "0204"
value, from_leitweg = email, False
else:
value, from_leitweg = str(leitweg_id or "").strip(), True
if not value:
return "", recipient_scheme
if "@" in value:
return value, "EM"
if from_leitweg:
return value, "0204"
return value, recipient_scheme
# Fester Hinweistext fuer Vorkasse. Vorkasse ist eine Zahlungs*bedingung* (BT-20), kein
# Zahlungs*mittel* - das Zahlungsmittel bleibt die Ueberweisung. Der Text wird daher zu den

14
main.py
View File

@ -348,14 +348,18 @@ with col2:
)
r_endpoint_scheme = r_endpoint_scheme_label.split(" - ")[0]
# Sichtbar machen, was tatsächlich als BT-49 exportiert wird - vor allem wenn es
# aus der Leitweg-ID (BT-10) abgeleitet wird, damit das leere Feld nicht "offen" wirkt.
# Sichtbar machen, was tatsächlich in BEIDE Felder (BT-49 + BT-49-1) exportiert wird -
# vor allem, wenn die Adresse aus der Leitweg-ID (BT-10) abgeleitet wird und das
# Feld BT-49 daher leer bleibt (sonst könnte man es für "noch offen" halten).
_bt49_preview, _bt49_scheme_preview = resolve_buyer_endpoint(r_email, r_endpoint_scheme, leitweg_id)
if _bt49_preview and not str(r_email).strip():
st.success(f"➡️ BT-49 wird automatisch aus der Leitweg-ID übernommen: "
f"**{_bt49_preview}** (Schema **{_bt49_scheme_preview}**) – hier nichts nötig.")
st.success(f"➡️ Wird automatisch aus der Leitweg-ID (BT-10) übernommen – die beiden "
f"Felder oben können leer bleiben:\n\n"
f"- **Elektronische Adresse (BT-49):** {_bt49_preview}\n"
f"- **Adress-Schema (BT-49-1):** {_bt49_scheme_preview}")
elif _bt49_preview:
st.caption(f"Export als BT-49: **{_bt49_preview}** · Schema **{_bt49_scheme_preview}**")
st.info(f"➡️ Export → **Elektronische Adresse (BT-49):** {_bt49_preview} · "
f"**Adress-Schema (BT-49-1):** {_bt49_scheme_preview}")
r_street = st.text_input("Straße (BT-50)", value=data.get("recipient_street", ""))
r_zip = st.text_input("PLZ (BT-53)", value=data.get("recipient_zip", ""))