PayPal-Mailabruf: Parken statt Buchen, echter Probelauf, Regressionstest
Die Mail-Verarbeitung ignorierte bisher die PayPal-Schalter: eingehende Zahlungen wurden auch dann automatisch gutgeschrieben, wenn der Betreiber die Funktion gesperrt oder der Mandant PayPal abgeschaltet hatte. Jetzt wird die Zahlung in dem Fall geparkt - gespeichert, aber ohne Buchung. Wegwerfen liesse eine echte Zahlung unbemerkt verschwinden, buchen widersprache der Abschaltung; die Zuordnungsseite bleibt fuer offene Zahlungen ja erreichbar. --dry-run war bisher irrefuehrend: es liess die Verarbeitung samt Buchung laufen und uebersprang nur das Setzen des Gelesen-Flags - ausgerechnet beim ersten Testlauf haette es also echtes Geld verbucht. Der Probelauf nutzt jetzt paypal_preview(), das nichts schreibt und meldet, was passieren wuerde (would_book/would_queue/would_park/duplicate). scripts/check-paypal-inbox-flow.php deckt die Kette ohne IMAP ab: Absenderpruefung, Token, Parser, Zuordnung, Netto-Buchung, Dedup, beide Park-Faelle und die Schreibfreiheit der Vorschau. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,13 @@ declare(strict_types=1);
|
||||
* 2. Absender gegen paypal.de/.com pruefen.
|
||||
* 3. Body parsen, Netto ermitteln, per Transaktionscode deduplizieren.
|
||||
* 4. Eindeutiger Namens-Match -> automatisch als Einzahlung buchen,
|
||||
* sonst in die Warteschlange legen.
|
||||
* sonst in die Warteschlange legen. Ist PayPal fuer den Mandanten
|
||||
* abgeschaltet, wird die Zahlung nur geparkt (gespeichert, nicht
|
||||
* gebucht).
|
||||
*
|
||||
* Mit --dry-run laeuft alles bis zur Vorschau: Verbindung, Zuordnung und
|
||||
* Ergebnis werden gemeldet, aber nichts gespeichert, gebucht oder als
|
||||
* gelesen markiert. Fuer den ersten Testlauf gedacht.
|
||||
*
|
||||
* Konfiguration ausschliesslich ueber Server-/Env-Einstellungen (Betreiber):
|
||||
* PAYPAL_INBOX_BASE z. B. zahlungen@kaffeeliste.de
|
||||
@@ -47,7 +53,7 @@ if (isset($opts['file'])) {
|
||||
}
|
||||
$recipient = (string) ($opts['recipient'] ?? '');
|
||||
$from = (string) ($opts['from'] ?? 'service@paypal.de');
|
||||
$result = paypal_process_raw($pdo, $recipient, $from, $body);
|
||||
$result = paypal_process_raw($pdo, $recipient, $from, $body, isset($opts['dry-run']));
|
||||
echo 'Ergebnis: ' . json_encode($result, JSON_UNESCAPED_UNICODE) . "\n";
|
||||
exit(0);
|
||||
}
|
||||
@@ -123,6 +129,7 @@ $messageCount = imap_num_msg($mbox);
|
||||
$processed = 0;
|
||||
$booked = 0;
|
||||
$queued = 0;
|
||||
$parked = 0;
|
||||
$skipped = 0;
|
||||
|
||||
for ($msgno = 1; $msgno <= $messageCount; $msgno++) {
|
||||
@@ -147,21 +154,34 @@ for ($msgno = 1; $msgno <= $messageCount; $msgno++) {
|
||||
$from = (string) ($overview->from ?? '');
|
||||
|
||||
$body = paypal_imap_fetch_body($mbox, $msgno);
|
||||
$result = paypal_process_raw($pdo, $recipient, $from, $body);
|
||||
// Im Probelauf wird nichts gespeichert und nichts gebucht - die Vorschau
|
||||
// sagt nur, was passieren wuerde.
|
||||
$result = paypal_process_raw($pdo, $recipient, $from, $body, $dryRun);
|
||||
|
||||
switch ($result['status']) {
|
||||
case 'booked':
|
||||
case 'would_book':
|
||||
$booked++;
|
||||
break;
|
||||
case 'unmatched':
|
||||
case 'would_queue':
|
||||
$queued++;
|
||||
break;
|
||||
case 'parked':
|
||||
case 'would_park':
|
||||
// PayPal ist fuer den Mandanten abgeschaltet: gespeichert, aber
|
||||
// bewusst nicht gebucht.
|
||||
$parked++;
|
||||
break;
|
||||
default:
|
||||
$skipped++;
|
||||
}
|
||||
|
||||
echo "Mail #{$msgno}: {$result['status']}"
|
||||
. (isset($result['tenant_id']) ? " (Mandant {$result['tenant_id']})" : '') . "\n";
|
||||
. (isset($result['tenant_id']) ? " (Mandant {$result['tenant_id']})" : '')
|
||||
. (isset($result['participant']) ? " -> {$result['participant']}" : '')
|
||||
. (isset($result['net_cents']) ? ' ' . number_format($result['net_cents'] / 100, 2, ',', '.') . ' EUR' : '')
|
||||
. "\n";
|
||||
|
||||
// Als gelesen markieren, damit sie nicht erneut verarbeitet wird.
|
||||
if (!$dryRun) {
|
||||
@@ -171,5 +191,6 @@ for ($msgno = 1; $msgno <= $messageCount; $msgno++) {
|
||||
|
||||
imap_close($mbox);
|
||||
|
||||
echo "Fertig: {$processed} verarbeitet, {$booked} gebucht, {$queued} in Warteschlange, {$skipped} uebersprungen"
|
||||
. ($dryRun ? ' (dry-run, nichts als gelesen markiert)' : '') . ".\n";
|
||||
echo "Fertig: {$processed} verarbeitet, {$booked} gebucht, {$queued} in Warteschlange, "
|
||||
. "{$parked} geparkt (PayPal abgeschaltet), {$skipped} uebersprungen"
|
||||
. ($dryRun ? ' (Probelauf: nichts gespeichert, nichts gebucht, nichts als gelesen markiert)' : '') . ".\n";
|
||||
|
||||
Reference in New Issue
Block a user