mein-sterntours/app/Services/MailDirService.php
2026-04-22 16:01:27 +02:00

95 lines
2.7 KiB
PHP

<?php
namespace App\Services;
use App\Models\Airline;
use App\Models\CMSContent;
use App\Models\Insurance;
use App\Models\TravelCompany;
class MailDirService
{
private static array $outputDirs = [];
public static function setOutputDir(string $dir, ?string $subdir): void
{
self::$outputDirs[$dir][] = $subdir;
}
/**
* @return string[]
*/
public static function getCustomerMailDirs(): \Illuminate\Database\Eloquent\Collection
{
return CMSContent::where('identifier', '=', 'customer-mail-dirs')->get()->sortBy('pos');
}
public static function getCustomerMailDir(int $id): ?CMSContent
{
return CMSContent::where('identifier', '=', 'customer-mail-dirs')->where('pos', '=', $id)->first();
}
public static function getCustomerMailName(CMSContent $mailDir, ?int $mailDirId): string
{
$model = self::resolveModel($mailDir, $mailDirId);
if ($model === null) {
return '';
}
if ($mailDir->getArrayContent('model') === 'TravelCountry') {
return $model->mail_dir_name ?? '';
}
return $model->name ?? '';
}
/**
* @return array<string>|string
*/
public static function getCustomerMailEmails(CMSContent $mailDir, ?int $mailDirId): array|string
{
$model = self::resolveModel($mailDir, $mailDirId);
if ($model === null) {
// Default: emails come directly from CMSContent
return $mailDir->getArrayContent('emails') ?? [];
}
return $model->contact_emails ?? [];
}
/**
* Returns subdirs from a mail collection that were not already in the output.
*
* @param \Illuminate\Database\Eloquent\Collection $mails Collection of CustomerMail or LeadMail
* @return string[]
*/
public static function getMailDirsNotInOutput(iterable $mails, string $dir): array
{
$processed = self::$outputDirs[$dir] ?? [];
$result = [];
foreach ($mails as $mail) {
if (!in_array($mail->subdir, $processed, true)) {
$result[] = $mail->subdir;
}
}
return $result;
}
private static function resolveModel(CMSContent $mailDir, ?int $mailDirId): mixed
{
if ($mailDirId === null) {
return null;
}
return match ($mailDir->getArrayContent('model')) {
'TravelCountry' => \App\Models\Sym\TravelCountry::find($mailDirId),
'Airline' => Airline::find($mailDirId),
'Insurance' => Insurance::find($mailDirId),
'TravelCompany' => TravelCompany::find($mailDirId),
default => null,
};
}
}