Calculation errors for refunded amounts

This commit is contained in:
2026-09-04 01:15:37 +02:00
parent 5beb2b1d97
commit c1c1a4f143
28 changed files with 1436 additions and 26 deletions
@@ -120,8 +120,8 @@ class AcceptRefundCommand
$invoice = $this->createInvoice($refund, $costUnit, $document);
// Erst jetzt, nicht früher: Beleg und Anmerkung der Abrechnung weisen den gezahlten Beitrag
// aus und läsen sonst bereits die 0.
$this->clearAmountPaid($refund);
// aus und läsen sonst bereits den verrechneten Stand.
$this->settleAmountPaid($refund);
$refund->invoice_id = $invoice->id;
$refund->save();
@@ -255,16 +255,23 @@ class AcceptRefundCommand
}
/**
* Setzt den gezahlten Beitrag des Teilis auf 0.
* Zieht den erstatteten Betrag vom gezahlten Beitrag ab.
*
* Mit der eingereichten Abrechnung ist der Beitrag nicht mehr beim Verband, sondern auf dem Weg
* zurück -- die Zahlungsübersichten der Aktionsleitung sollen ihn nicht länger als offen führen. Der
* ursprüngliche Betrag steht zur Kontrolle in der Anmerkung der Abrechnung und auf dem Beleg.
* Danach führt `amount_paid` genau das, was beim Verband geblieben ist -- bei voller Erstattung also
* 0, bei einer Teilerstattung den einbehaltenen Rest. Auf diesem Feld baut die Einnahmenrechnung der
* Veranstaltung auf; es muss deshalb den tatsächlichen Bestand abbilden und nicht die Zahlung von
* einst. Der ursprüngliche Betrag steht zur Kontrolle in der Anmerkung der Abrechnung und auf dem
* Beleg.
*/
private function clearAmountPaid(ParticipantRefund $refund): void
private function settleAmountPaid(ParticipantRefund $refund): void
{
$participant = $refund->participant;
$participant->amount_paid = new Amount(0.0, 'Euro');
$paid = $participant->amount_paid?->getAmount() ?? 0.0;
$refunded = $refund->amount?->getAmount() ?? 0.0;
// `max` gegen Rundungsreste: Ein negativer gezahlter Betrag wäre in jeder Auswertung Unsinn.
$participant->amount_paid = new Amount(max(0.0, round($paid - $refunded, 2)), 'Euro');
$participant->save();
}