PayPal-Zahlungen auch ueber die Mailadresse zuordnen

Bisher verglich die Zuordnung ausschliesslich Namen: der Parser las die
Adresse des Zahlers gar nicht aus, und die Suche kannte nur paypal_name und
display_name. Eine Zahlung von genau der Adresse, die beim Mitglied
hinterlegt ist, blieb deshalb liegen.

Die Adresse wird jetzt ausgelesen (neue Spalte paypal_payments.payer_email),
in der Warteschlange angezeigt und zuerst geprueft - sie ist im Mandanten
eindeutig und aendert sich nicht, wenn jemand bei PayPal anders heisst.

Der heikle Teil ist das Aussortieren: In einer weitergeleiteten Mail stehen
mehrere Adressen. Die falsche zu nehmen wuerde fremdes Geld dem Mitglied
hinter dieser Adresse gutschreiben - typischerweise dem Kassenwart. Deshalb
fallen paypal.*-Adressen und die eigene Eingangsadresse raus (geprueft
gegen die tatsaechliche Empfaengeradresse, Plus-Adressierung ignoriert),
und es zaehlt nur eine Adresse in unmittelbarer Naehe des Zahlernamens.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 22:17:48 +02:00
co-authored by Claude Opus 5
parent 25bdb6f34b
commit d7de0d92cf
6 changed files with 241 additions and 10 deletions
+28
View File
@@ -222,3 +222,31 @@ Name auch auf ein anderes Mitglied, wird nichts gelernt — sonst wäre die
Zuordnung mehrdeutig und würde gar nicht mehr greifen. Was gelernt wurde,
steht in der Erfolgsmeldung und im Audit-Log
(`paypal_import.manual_assigned`, Feld `learned_paypal_name`).
### Zuordnung über die Mailadresse
Stand: 2026-08-21. `paypal_match_participant()` prüft in dieser Reihenfolge:
1. **Mailadresse des Zahlers** gegen `participants.email_norm` — im
Mandanten eindeutig (Unique Key auf `tenant_id + email_norm`) und
unabhängig davon, wie jemand bei PayPal heißt.
2. Zahlername gegen `paypal_name`/`display_name` (genau ein Treffer).
3. Mitteilung des Zahlers gegen dieselben Felder.
Die Adresse zieht `paypal_extract_payer_email()` aus der Mail und
`paypal_payments.payer_email` (Migration `0028`) hält sie fest; in der
Warteschlange steht sie unter dem Zahlernamen.
Das Heikle daran ist nicht das Finden, sondern das Aussortieren: In einer
weitergeleiteten Mail stehen mehrere Adressen — die von PayPal, die
Eingangsadresse der Kaffeeliste, je nach Weiterleitung die des
ursprünglichen Empfängers. Würde davon die falsche genommen, bekäme das
Mitglied hinter dieser Adresse fremdes Geld gutgeschrieben. Deshalb:
- alles auf `paypal.*` fällt raus,
- die eigene Eingangsadresse fällt raus — geprüft gegen die tatsächliche
Empfängeradresse der Mail (`paypal_same_mailbox()`, Plus-Adressierung
wird ignoriert), nicht nur gegen `PAYPAL_INBOX_BASE`,
- übrig bleibt nur eine Adresse, die **nahe am Namen des Zahlers** steht;
ist keine in Reichweite, wird keine genommen und es bleibt beim
Namensvergleich.