PayPal-Name aus der manuellen Zuordnung lernen

Die automatische Zuordnung verlangt exakte Uebereinstimmung des
Zahlernamens mit Anzeigename oder PayPal-Name des Mitglieds. Heisst jemand
bei PayPal anders, landet jede Zahlung in der Warteschlange - auch die
zehnte, obwohl der Fall laengst einmal von Hand geklaert wurde.

Nach einer manuellen Zuordnung wird der Zahlername deshalb beim Mitglied
hinterlegt. Zurueckhaltend: ein gepflegter PayPal-Name wird nie
ueberschrieben, ein Name gleich dem Anzeigenamen bringt nichts, und passt
der Name auch auf ein anderes Mitglied, wird nichts gelernt - das wuerde
die Zuordnung mehrdeutig machen und damit blockieren.

Was gelernt wurde, steht in der Erfolgsmeldung und im Audit-Log; eine
stillschweigende Aenderung am Mitglied waere sonst schwer nachvollziehbar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 22:03:12 +02:00
co-authored by Claude Opus 5
parent f4b57abd93
commit 25bdb6f34b
4 changed files with 115 additions and 2 deletions
+29
View File
@@ -129,6 +129,35 @@ try {
paypal_flow_assert('unbekannter Zahler landet in der Warteschlange', ($ergebnisB['status'] ?? '') === 'unmatched', $failures, $passes);
paypal_flow_assert('Warteschlange enthaelt die Zahlung', paypal_count_unmatched($pdo, $tenantA) === 1, $failures, $passes);
// --- Der PayPal-Name wird aus der manuellen Zuordnung gelernt: beim
// naechsten Mal soll dieselbe Person automatisch getroffen werden.
$abweichend = paypal_flow_participant($pdo, $tenantA, "Bernd Beispiel {$namensSuffix}", $suffix . 'x');
$codeE = 'TXNLERN' . strtoupper(bin2hex(random_bytes(4)));
$zahlername = "Bernd B. Beispiel-Handel {$namensSuffix}";
$mailE = paypal_flow_mail($zahlername, '4,00', $codeE, 'erste Zahlung');
$ergebnisE = paypal_process_raw($pdo, $empfaengerA, 'service@paypal.de', $mailE);
paypal_flow_assert('abweichender Zahlername landet zunaechst in der Warteschlange', ($ergebnisE['status'] ?? '') === 'unmatched', $failures, $passes);
$zuordnung = paypal_assign_payment($pdo, $tenantA, (int) $ergebnisE['payment_id'], $abweichend, null);
paypal_flow_assert('manuelle Zuordnung bucht die Zahlung', ($zuordnung['ok'] ?? false) === true, $failures, $passes);
paypal_flow_assert('manuelle Zuordnung merkt sich den PayPal-Namen', ($zuordnung['learned_paypal_name'] ?? null) === $zahlername, $failures, $passes);
$codeF = 'TXNAUTO2' . strtoupper(bin2hex(random_bytes(4)));
$mailF = paypal_flow_mail($zahlername, '4,00', $codeF, 'zweite Zahlung');
$ergebnisF = paypal_process_raw($pdo, $empfaengerA, 'service@paypal.de', $mailF);
paypal_flow_assert('zweite Zahlung desselben Zahlers wird automatisch gebucht', ($ergebnisF['status'] ?? '') === 'booked', $failures, $passes);
paypal_flow_assert('beide Zahlungen sind gutgeschrieben', paypal_flow_balance($pdo, $abweichend) === 800, $failures, $passes);
// Ein bereits gepflegter PayPal-Name wird nicht ueberschrieben.
$codeG = 'TXNKEEP' . strtoupper(bin2hex(random_bytes(4)));
$mailG = paypal_flow_mail('Ganz Anderer Name', '2,00', $codeG, 'fremder Name');
$ergebnisG = paypal_process_raw($pdo, $empfaengerA, 'service@paypal.de', $mailG);
$zuordnungG = paypal_assign_payment($pdo, $tenantA, (int) $ergebnisG['payment_id'], $abweichend, null);
paypal_flow_assert('gepflegter PayPal-Name bleibt unveraendert', ($zuordnungG['learned_paypal_name'] ?? null) === null, $failures, $passes);
$gespeichert = $pdo->prepare('SELECT paypal_name FROM participants WHERE id = ?');
$gespeichert->execute([$abweichend]);
paypal_flow_assert('gespeichert ist weiterhin der erste Zahlername', (string) $gespeichert->fetchColumn() === $zahlername, $failures, $passes);
// --- Fall 3: Mandant hat PayPal abgeschaltet -> parken, nicht buchen
$tenantB = paypal_flow_tenant($pdo, $suffix, 'b', $tenantIds);
$participantB = paypal_flow_participant($pdo, $tenantB, "Max Mustermann {$namensSuffix}", $suffix);