- Mail campaign: mẫu nhắc gia hạn thanh toán QR, chọn dịch vụ + chu kỳ từng dòng (renewal_services) - Hosting: nhiều server Plesk cho một gói (service_plan_servers), chuyển server khi server chết - Admin xem/sửa giấy tờ định danh khách, tuỳ chọn gia hạn cho khách, nhật ký cấp phát dịch vụ - Đánh dấu mẫu email dịch vụ là non-marketing Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
55 lines
1.7 KiB
PHP
55 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Email;
|
|
|
|
use App\Models\Customer;
|
|
use App\Models\MailCampaign;
|
|
use App\Models\Template;
|
|
use App\Support\MailGlobals;
|
|
use App\Support\MailPlaceholders;
|
|
use App\Support\RenewalCampaign;
|
|
|
|
final class MailCampaignRenderer
|
|
{
|
|
/**
|
|
* @param array<string, string> $values
|
|
* @return array{subject: string, html: string}
|
|
*/
|
|
public function render(MailCampaign $campaign, array $values): array
|
|
{
|
|
$subject = MailPlaceholders::fill((string) $campaign->subject, $values, escapeHtml: false);
|
|
$content = MailPlaceholders::fill((string) $campaign->message, $values);
|
|
|
|
return [
|
|
'subject' => $subject,
|
|
'html' => $campaign->template_id ? $content : Template::renderWithLayout($subject, $content),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @return array<string, string>
|
|
*/
|
|
public function recipientValues(MailCampaign $campaign, ?Customer $customer, string $email): array
|
|
{
|
|
return [...MailGlobals::values(), ...MailPlaceholders::recipientValues($customer, $email), ...$this->adminValues($campaign)];
|
|
}
|
|
|
|
/**
|
|
* @return array<string, string>
|
|
*/
|
|
public function sampleValues(MailCampaign $campaign): array
|
|
{
|
|
$samples = array_map(fn (string $key) => "[{$key}]", array_combine(
|
|
array_keys(MailPlaceholders::RECIPIENT_FIELDS),
|
|
array_keys(MailPlaceholders::RECIPIENT_FIELDS),
|
|
));
|
|
|
|
return [...MailGlobals::values(), ...$samples, ...$this->adminValues($campaign), ...RenewalCampaign::sampleValues($campaign)];
|
|
}
|
|
|
|
private function adminValues(MailCampaign $campaign): array
|
|
{
|
|
return array_filter($campaign->variables ?? [], fn ($value) => $value !== null && $value !== '');
|
|
}
|
|
}
|