From 72e0502bb908ac752c6f38e8c5546ac388275d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=BCnther?= Date: Thu, 6 Aug 2026 10:15:46 +0200 Subject: [PATCH] Bugfix on closing cost units --- .env.example | 2 + .../CostUnitInvalidBillingDeadlineMail.php | 55 +++++++++++++++++++ app/Tasks/CloseCostUnit.php | 23 ++++++++ config/app.php | 2 + ...st_unit_invalid_billing_deadline.blade.php | 16 ++++++ version | 2 +- 6 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 app/Mail/AdminMails/CostUnitInvalidBillingDeadlineMail.php create mode 100644 resources/views/emails/admin/cost_unit_invalid_billing_deadline.blade.php diff --git a/.env.example b/.env.example index c0660ea..f3dbb27 100644 --- a/.env.example +++ b/.env.example @@ -56,6 +56,8 @@ MAIL_PASSWORD=null MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_NAME="${APP_NAME}" +APP_ADMIN_MAIL= + AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 diff --git a/app/Mail/AdminMails/CostUnitInvalidBillingDeadlineMail.php b/app/Mail/AdminMails/CostUnitInvalidBillingDeadlineMail.php new file mode 100644 index 0000000..6e499c8 --- /dev/null +++ b/app/Mail/AdminMails/CostUnitInvalidBillingDeadlineMail.php @@ -0,0 +1,55 @@ +costUnitId), + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + return new Content( + view: 'emails.admin.cost_unit_invalid_billing_deadline', + with: [ + 'costUnitId' => $this->costUnitId, + 'costUnitName' => $this->costUnitName, + 'invalidBillingDeadline' => $this->invalidBillingDeadline, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Tasks/CloseCostUnit.php b/app/Tasks/CloseCostUnit.php index 6854426..2e80dc3 100644 --- a/app/Tasks/CloseCostUnit.php +++ b/app/Tasks/CloseCostUnit.php @@ -6,9 +6,11 @@ use App\Domains\CostUnit\Actions\ChangeCostUnitDetails\ChangeCostUnitDetailsComm use App\Domains\CostUnit\Actions\ChangeCostUnitDetails\ChangeCostUnitDetailsRequest; use App\Domains\CostUnit\Actions\ChangeCostUnitState\ChangeCostUnitStateCommand; use App\Domains\CostUnit\Actions\ChangeCostUnitState\ChangeCostUnitStateRequest; +use App\Mail\AdminMails\CostUnitInvalidBillingDeadlineMail; use App\Models\CostUnit; use App\Repositories\CostUnitRepository; use App\ValueObjects\Amount; +use Illuminate\Support\Facades\Mail; class CloseCostUnit implements CronTask { public function handle(): void @@ -33,6 +35,27 @@ class CloseCostUnit implements CronTask { } $billingEndTime = \DateTime::createFromFormat('Y-m-d H:i:s', $billingEnd); + if (false === $billingEndTime) { + $billingEndTime = \DateTime::createFromFormat('Y-m-d', $billingEnd); + } + + if (false === $billingEndTime) { + $recipients = config('app.admin_mail'); + if (null === $recipients) { + $recipients = CostUnit::where('id', $costUnit['id'])->first() + ?->treasurers()->pluck('email')->all() ?? []; + } + + if (!empty($recipients)) { + Mail::to($recipients)->send(new CostUnitInvalidBillingDeadlineMail( + costUnitId: $costUnit['id'], + costUnitName: $costUnit['name'] ?? null, + invalidBillingDeadline: $billingEnd, + )); + } + + continue; + } $billingEndTime->setTime(0,0,0); $billingEndTime->add(new \DateInterval('P1D')); diff --git a/config/app.php b/config/app.php index 99d08ae..70f221a 100644 --- a/config/app.php +++ b/config/app.php @@ -15,6 +15,8 @@ return [ 'name' => env('APP_NAME', 'Laravel'), + 'admin_mail' => env('APP_ADMIN_MAIL'), + /* |-------------------------------------------------------------------------- | Application Environment diff --git a/resources/views/emails/admin/cost_unit_invalid_billing_deadline.blade.php b/resources/views/emails/admin/cost_unit_invalid_billing_deadline.blade.php new file mode 100644 index 0000000..95c95c6 --- /dev/null +++ b/resources/views/emails/admin/cost_unit_invalid_billing_deadline.blade.php @@ -0,0 +1,16 @@ + + + +

+ Für die Kostenstelle "{{ $costUnitName }}" (ID {{ $costUnitId }}) konnte das Abrechnungsende + nicht verarbeitet werden. +

+

+ Der hinterlegte Wert "{{ $invalidBillingDeadline }}" ist weder ein gültiges Datum noch ein + Datum mit Uhrzeit. Die automatische Verarbeitung dieser Kostenstelle wurde deshalb übersprungen. +

+

+ Bitte prüft und korrigiert das Abrechnungsende dieser Kostenstelle. +

+ + diff --git a/version b/version index 8ac28bf..c78c496 100644 --- a/version +++ b/version @@ -1 +1 @@ -4.6.1 +4.6.2