Kundenabo-Seite: Vorschau taggenau, Liste mit den tatsaechlich gebuchten Punkten

Vorschau und Liste liessen sich nicht gegeneinander nachrechnen — zwei Ursachen,
beide hier behoben.

1. Die Vorschau nahm eine pauschale Monatssumme als Basis. Damit enthielt die
   Kachel zum 5. auch schon die Lieferungen vom 10. Jetzt zaehlt je Termin, was
   bis zu diesem Tag gebucht war, plus die bis dahin offenen Lieferungen.
   Buchungen nach dem letzten Liefertag (Nachzuegler, manuelle Gutschriften)
   haengen sich an die letzte Kachel, damit die den Monatsstand zeigt. Jede
   Kachel weist ihre Aufschluesselung aus ("457 abgerechnet + 131 offen").

   Beraterin 454 im September: 132 / 457 / 588 / 776 statt 0 / 0 / 131 / 319.

2. Die Liste zeigte nur den wiederkehrenden Abo-Inhalt. Einmal-Artikel und
   sonstige Zubuchungen einer Lieferung werden nach der Ausfuehrung aus dem Abo
   entfernt und tauchten deshalb nirgends mehr auf — bei Abo 266 waren das 43
   Punkte, bei Abo 418 rund 39. Neue Spalte "Diesen Monat" mit den je Abo
   tatsaechlich gebuchten Punkten, bei Abweichung mit dem Zusatz "+43 einmalig",
   dazu eine Summenzeile. Ein nicht zuordenbarer Rest (geloeschtes Abo, Buchung
   ohne Ausfuehrungsbezug) wird gesondert ausgewiesen, damit die Addition aufgeht.

   Die Spalte erscheint nur ohne Monatsfilter; fuer einen vergangenen Monat waere
   sie irrefuehrend.

Summe der Monatsspalte = Basis der letzten Kachel; Summe der Abo-Punkte der Abos
mit Termin 20./25. = deren offener Teil.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-11 08:19:35 +00:00
parent cb5664a483
commit 685f7a90b9
11 changed files with 458 additions and 59 deletions

View file

@ -91,6 +91,11 @@ class AboController extends Controller
->orderBy('id', 'desc')
->get();
// Vorschau und Monatsspalte gelten fuer den laufenden Monat; bei einem
// Filter auf einen anderen Monat waeren sie irrefuehrend.
$isCurrentMonthView = $selectedMonth === 0
|| ($selectedMonth === (int) now()->month && $selectedYear === (int) now()->year);
return view('user.abo.index', [
'user_abos' => $user_abos,
'abo_payment_links' => $this->getAboPaymentLinks(),
@ -98,9 +103,18 @@ class AboController extends Controller
'isAdmin' => false,
// Liefertag-Vorschau nur aus den eigenen Kundenabos
// (Kundenwunsch 2026-09-07), und nur im laufenden Monat sinnvoll.
'customerAboForecast' => $selectedMonth === 0 || ($selectedMonth === (int) now()->month && $selectedYear === (int) now()->year)
'customerAboForecast' => $isCurrentMonthView
? app(PaylineForecastService::class)->personalCustomerAboForecast(\Auth::user())
: null,
// Je Abo die im laufenden Monat abgerechneten Punkte — inklusive
// Einmal-Artikel, die nach der Ausfuehrung aus dem Abo verschwinden.
// Ohne diese Spalte laesst sich die Vorschau oben nicht nachrechnen.
'customerAboBilled' => $isCurrentMonthView
? app(PaylineForecastService::class)->billedCustomerAboPointsByAbo(\Auth::user(), (int) now()->month, (int) now()->year)
: null,
'customerAboBilledTotal' => $isCurrentMonthView
? app(PaylineForecastService::class)->billedCustomerAboPoints(\Auth::user(), (int) now()->month, (int) now()->year)
: null,
'chartData' => AboHelper::getMonthlyAboCounts($baseQuery, $selectedYear, 'ot', \Auth::user()->id),
'chartYear' => $selectedYear,
'chartYears' => HTMLHelper::getYearRange(2026),