schneespur/schneespur/app/Jobs/SendCustomerReportEmail.php
Michael b8e426ba2d Restructure: move code into schneespur/ subdirectory, fix Umlauts
- Move all application code into schneespur/ subdirectory for cleaner
  GitHub presentation (README, LICENSE, INSTALL guides stay in root)
- Fix German Umlaut encoding in INSTALL.de.md and README.md
  (ae→ä, oe→ö, ue→ü throughout)
- ZIP download structure remains flat (code in root) for easy deployment
2026-05-17 13:52:39 +00:00

168 lines
5.2 KiB
PHP

<?php
namespace App\Jobs;
use App\Mail\CustomerReportMail;
use App\Models\Customer;
use App\Models\CustomerObject;
use App\Services\NotificationLogService;
use App\Services\PdfReportService;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
class SendCustomerReportEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(
public Customer $customer,
public Carbon $from,
public Carbon $to,
public ?CustomerObject $customerObject = null,
) {}
public function handle(PdfReportService $pdfReportService, NotificationLogService $notificationLogService): void
{
$type = 'customer_report_email';
$object = $this->customerObject;
$recipients = $this->resolveRecipients();
if (empty($recipients)) {
Log::warning('SendCustomerReportEmail: no recipient email', [
'customer_id' => $this->customer->id,
'customer_object_id' => $object?->id,
]);
return;
}
$jobQuery = $object
? $object->serviceJobs()
: $this->customer->serviceJobs();
$jobCount = $jobQuery
->where('started_at', '>=', $this->from)
->where('started_at', '<=', $this->to->copy()->endOfDay())
->whereNotNull('ended_at')
->count();
$metadata = [
'period_from' => $this->from->toDateString(),
'period_to' => $this->to->toDateString(),
'job_count' => $jobCount,
'customer_object_id' => $object?->id,
'customer_object_name' => $object?->name,
];
$pdfContent = null;
$pdfFilename = '';
try {
$pdf = $object
? $pdfReportService->generateObjectReport($object, $this->from, $this->to)
: $pdfReportService->generateCustomerReport($this->customer, $this->from, $this->to);
$pdfContent = $pdf->output();
$pdfFilename = $object
? $pdfReportService->objectReportFilename($object, $this->from, $this->to)
: $pdfReportService->customerReportFilename($this->customer, $this->from, $this->to);
$metadata['pdf_size_bytes'] = strlen($pdfContent);
} catch (\Throwable $e) {
Log::warning('PDF generation failed for customer report email', [
'customer_id' => $this->customer->id,
'customer_object_id' => $object?->id,
'error' => $e->getMessage(),
]);
foreach ($recipients as $recipient) {
$notificationLogService->logFailedForCustomer(
$this->customer,
$type,
$recipient,
'PDF generation failed: ' . $e->getMessage(),
$metadata,
);
}
return;
}
if (strlen($pdfContent) > 25 * 1024 * 1024) {
foreach ($recipients as $recipient) {
$notificationLogService->logFailedForCustomer(
$this->customer,
$type,
$recipient,
'PDF exceeds 25 MB size limit',
$metadata,
);
}
return;
}
foreach (array_unique($recipients) as $recipient) {
try {
Mail::to($recipient)->send(new CustomerReportMail(
$this->customer,
$this->from,
$this->to,
$pdfContent,
$pdfFilename,
$this->customerObject,
));
$notificationLogService->logSentForCustomer(
$this->customer,
$type,
$recipient,
$metadata,
);
} catch (\Throwable $e) {
$notificationLogService->logFailedForCustomer(
$this->customer,
$type,
$recipient,
$e->getMessage(),
$metadata,
);
}
}
}
/**
* @return string[]
*/
private function resolveRecipients(): array
{
$object = $this->customerObject;
$customer = $this->customer;
if (! $object) {
$email = $customer->notification_email ?? $customer->email;
return $email ? [$email] : [];
}
$mode = $object->notify_recipients ?? 'customer';
$customerEmail = $customer->notification_email ?? $customer->email;
$objectEmail = $object->contact_email;
$recipients = [];
if (in_array($mode, ['customer', 'both']) && ! empty($customerEmail)) {
$recipients[] = $customerEmail;
}
if (in_array($mode, ['object', 'both']) && ! empty($objectEmail)) {
$recipients[] = $objectEmail;
}
return $recipients;
}
}