Abo (A1+A2): Liefertag frei waehlbar 1-31, Aenderung nur nach vorn, Sperre erst am Ausfuehrungstag

A1: Jeder Monatstag ist als Liefertag erlaubt (UserAbo::allowedDeliveryDays),
Tage 29-31 liefern in kuerzeren Monaten am letzten Tag. Eine Stelle
AboHelper::dateForDayInMonth klammert; setNextDate, Erstausfuehrung,
Admin-Termin und Pause rechnen darueber, der Folgemonat immer aus dem
Liefertag (31.01 -> 28.02 -> 31.03). Liefertag-Aenderung gilt fuer den
laufenden Zyklus und nur nach vorn: ist der Tag im Referenzmonat vorbei,
wird abgelehnt, der Monat verschiebt sich nie (Rueckfrage R1).
Admin-Filter "naechste Ausfuehrung" als Datumsbereich. Prognose-Kacheln
bekommen die Kachel Monatsende, Team-Abos rechnen bis Monatsende.

A2: Sperrfristen Default 0, Setting 0 ist ausdruecklich 0 (fiel bisher auf
den Default zurueck). Bedingung Kalendertage <= Sperre, zentral in
AboHelper::isWithinLock: am Ausfuehrungstag ab 0:00 Uhr fixiert, Vortag bis
23:59 Uhr frei, fuer Liefertag, Produkte, Pause und Kuendigung (R2). Texte
mit _zero-Varianten ueber AboHelper::lockMessage.

Sprachdateien de/en/es/fr, neuer AboDeliveryDayTest, bestehende Tests
angepasst, Plan-Status mit Deploy-Schritt (Settings auf 0).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-16 11:28:55 +00:00
parent d6efe56cd4
commit cf0311afc1
30 changed files with 638 additions and 185 deletions

View file

@ -119,6 +119,7 @@ it('lehnt die Pause vor Erreichen der Mindestlaufzeit ab', function (): void {
});
it('lehnt die Pause innerhalb der Sperrfrist vor der Ausfuehrung ab', function (): void {
Setting::setContentBySlug('abo-lock-days-pause-cancel', 3, 'int');
$user = aptMakeUser();
$abo = aptMakeAbo($user, nextDate: '2026-07-24'); // in 2 Tagen, Sperre = 3 Tage
@ -126,6 +127,16 @@ it('lehnt die Pause innerhalb der Sperrfrist vor der Ausfuehrung ab', function (
->and($abo->fresh()->pause_count)->toBe(0);
});
it('lehnt die Pause ohne Vorlaufsperre nur am Ausfuehrungstag selbst ab (A2)', function (): void {
$user = aptMakeUser();
$tomorrow = aptMakeAbo($user, nextDate: '2026-07-23');
$today = aptMakeAbo(aptMakeUser(), nextDate: '2026-07-22');
expect(aptPause($tomorrow))->toBeTrue()
->and(aptPause($today))->toBeFalse()
->and(session('alert-error'))->toBe(__('abo.error_pause_locked_zero', ['lock' => 0, 'days' => 0, 'date' => '22.07.2026']));
});
it('erlaubt die Pause nur einmal pro rollierendem Intervall', function (): void {
$user = aptMakeUser();