Zeitzone Europe/Berlin: unnoetige UTC-Konvertierung entfernt

Beim Speichern/Veroeffentlichen waren Termine 2 Stunden versetzt: die
App-Zeitzone stand auf UTC, Termine wurden nach UTC umgerechnet, aber
published_at roh angezeigt.

- config/app.php: timezone UTC -> Europe/Berlin
- PressRelease: DISPLAY_TIMEZONE + setTimezone-Umrechnung entfernt
- Admin-/Customer-Formulare: scheduledAtUtc() -> resolveScheduledAt(),
  parst direkt in App-Zeitzone; Edit-Hydration ohne setTimezone
- ProofPdfRenderer + Boost-Anzeige: setTimezone entfernt
- Tests an verschiebungsfreies Verhalten angepasst

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-06-18 12:40:19 +00:00
parent 326ff9b2a0
commit 624fca68a8
12 changed files with 56 additions and 68 deletions

View file

@ -47,10 +47,9 @@ test('admin create form persistiert scheduled_at aus datum und uhrzeit ohne emba
$pr = PressRelease::query()->latest('id')->firstOrFail();
// Eingabe 14:30 erfolgt in Europe/Berlin (CEST, +02:00) und wird als
// 12:30 UTC gespeichert.
expect($pr->scheduled_at?->toDateTimeString())->toBe('2026-06-05 12:30:00');
expect($pr->scheduled_at?->copy()->setTimezone('Europe/Berlin')->format('Y-m-d H:i'))->toBe('2026-06-05 14:30');
// Die App läuft in Europe/Berlin; die Eingabe 14:30 wird ohne Umrechnung
// als 14:30 gespeichert.
expect($pr->scheduled_at?->toDateTimeString())->toBe('2026-06-05 14:30:00');
expect($pr->embargo_at)->toBeNull();
});
@ -83,9 +82,8 @@ test('admin edit hydriert scheduled_at in datum und uhrzeit ohne embargo', funct
$this->actingAs($admin);
$pr = PressRelease::factory()->create([
// 12:30 UTC entspricht 14:30 in Europe/Berlin (CEST) – so wird der
// Termin in den Eingabefeldern angezeigt.
'scheduled_at' => '2026-06-05 12:30:00',
// Wert wird unverändert (Europe/Berlin) in den Eingabefeldern angezeigt.
'scheduled_at' => '2026-06-05 14:30:00',
'embargo_at' => '2026-06-10 08:00:00',
]);
@ -121,8 +119,8 @@ test('admin edit persistiert scheduled_at aus datum und uhrzeit ohne embargo', f
$pr->refresh();
// Eingabe 09:00 in Europe/Berlin (CEST, +02:00) wird als 07:00 UTC gespeichert.
expect($pr->scheduled_at?->toDateTimeString())->toBe('2026-06-08 07:00:00');
// Eingabe 09:00 (Europe/Berlin) wird ohne Umrechnung als 09:00 gespeichert.
expect($pr->scheduled_at?->toDateTimeString())->toBe('2026-06-08 09:00:00');
expect($pr->embargo_at)->toBeNull();
});

View file

@ -91,10 +91,10 @@ test('admin show zeigt Scheduling-Termin im Review-Workflow', function () {
'scheduled_at' => '2026-06-15 10:00:00',
]);
// 10:00 UTC wird in Europe/Berlin (CEST, +02:00) als 12:00 angezeigt.
// Die App läuft in Europe/Berlin; 10:00 wird unverändert angezeigt.
LivewireVolt::test('admin.press-releases.show', ['id' => $pr->id])
->assertSee('Geplante Veröffentlichung')
->assertSee('15.06.2026 12:00');
->assertSee('15.06.2026 10:00');
});
test('admin show zeigt Embargo-Info im Published-Workflow', function () {

View file

@ -52,10 +52,9 @@ test('create form persistiert scheduled_at aus datum und uhrzeit ohne embargo',
$pr = PressRelease::query()->latest('id')->firstOrFail();
// Eingabe 14:30 erfolgt in Europe/Berlin (CEST, +02:00) und wird als
// 12:30 UTC gespeichert.
expect($pr->scheduled_at?->toDateTimeString())->toBe('2026-06-05 12:30:00');
expect($pr->scheduled_at?->copy()->setTimezone('Europe/Berlin')->format('Y-m-d H:i'))->toBe('2026-06-05 14:30');
// Die App läuft in Europe/Berlin; die Eingabe 14:30 wird ohne Umrechnung
// als 14:30 gespeichert.
expect($pr->scheduled_at?->toDateTimeString())->toBe('2026-06-05 14:30:00');
expect($pr->embargo_at)->toBeNull();
});
@ -122,9 +121,8 @@ test('edit form hydriert scheduled_at in datum und uhrzeit ohne embargo', functi
'category_id' => $category->id,
'portal' => $company->portal->value,
'status' => 'draft',
// 12:30 UTC entspricht 14:30 in Europe/Berlin (CEST) – so wird der
// Termin in den Eingabefeldern angezeigt.
'scheduled_at' => '2026-06-05 12:30:00',
// Wert wird unverändert (Europe/Berlin) in den Eingabefeldern angezeigt.
'scheduled_at' => '2026-06-05 14:30:00',
'embargo_at' => '2026-06-10 08:00:00',
]);
$pr->contacts()->sync([$contact->id]);

View file

@ -73,10 +73,10 @@ test('customer show zeigt geplante Veröffentlichung wenn gesetzt', function ()
]);
$this->actingAs($customer);
// 09:30 UTC wird in Europe/Berlin (CEST, +02:00) als 11:30 angezeigt.
// Die App läuft in Europe/Berlin; 09:30 wird unverändert angezeigt.
LivewireVolt::test('customer.press-releases.show', ['id' => $pr->id])
->assertSee('Geplante Veröffentlichung')
->assertSee('01.07.2026 11:30');
->assertSee('01.07.2026 09:30');
});
test('customer show zeigt Sperrfrist wenn embargo_at gesetzt', function () {
@ -87,10 +87,10 @@ test('customer show zeigt Sperrfrist wenn embargo_at gesetzt', function () {
]);
$this->actingAs($customer);
// 12:00 UTC wird in Europe/Berlin (CEST, +02:00) als 14:00 angezeigt.
// Die App läuft in Europe/Berlin; 12:00 wird unverändert angezeigt.
LivewireVolt::test('customer.press-releases.show', ['id' => $pr->id])
->assertSee('Sperrfrist bis')
->assertSee('15.08.2026 14:00');
->assertSee('15.08.2026 12:00');
});
test('customer show zeigt Kein-Export-Hinweis wenn no_export aktiv', function () {