Files
baodev0andClaude Sonnet 5.5 b44a88bb52 feat(service): huỷ dịch vụ, SSL, đổi mật khẩu hosting, lịch sử thanh toán theo hình thức
- Lịch sử thanh toán hoá đơn trả thêm `method` (tự động gia hạn / số dư / admin / chuyển khoản / hoàn tiền), bỏ đuôi `(method)` khỏi ghi chú
- `DnsServer::panelUrl()` = https://<domain>/ dùng cho email cấp hosting và nút Plesk của khách
- Order item trả thêm `uuid`/`type` của dịch vụ để FE dẫn tới trang quản lý
- Yêu cầu huỷ dịch vụ, chứng chỉ SSL, lịch sử gia hạn, đổi mật khẩu hosting cho khách

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 16:40:24 +07:00

225 lines
13 KiB
PHP

<?php
namespace Database\Seeders\EmailTemplates;
use App\Support\EmailTemplateShell as T;
final class AdminTemplates
{
/**
* @return array<int, array{scenario: string, name: string, subject: string, body: string}>
*/
public static function all(): array
{
return [
[
'scenario' => 'admin_payment_received',
'name' => '[Admin] Khách hàng thanh toán',
'subject' => '[ADMIN] Khách hàng thanh toán {{payment_type}} #{{reference}}',
'body' => T::title('Khách hàng vừa thanh toán')
. T::paragraph('Hệ thống <strong>{{company_name}}</strong> vừa ghi nhận một khoản thanh toán mới.')
. T::infoTable([
'Loại thanh toán' => '{{payment_type}}',
'Mã tham chiếu' => '#{{reference}}',
'Số hóa đơn' => '{{invoice_number}}',
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
'Số tiền vừa trả' => '{{amount_formatted}}',
'Còn thiếu' => '{{outstanding_formatted}}',
'Trạng thái' => '{{payment_status}}',
'Thời gian' => '{{created_at}}',
]),
],
[
'scenario' => 'admin_service_renewed',
'name' => '[Admin] Dịch vụ được gia hạn',
'subject' => '[ADMIN] {{admin_name}} gia hạn dịch vụ {{product_name}} — {{customer_email}}',
'body' => T::title('Dịch vụ vừa được gia hạn')
. T::paragraph('Nhân viên <strong>{{admin_name}}</strong> vừa gia hạn dịch vụ cho khách hàng.')
. T::infoTable([
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
'Dịch vụ' => '{{product_name}}{{server_name_suffix}}',
'Thời gian gia hạn' => '{{months_label}}',
'Hạn sử dụng trước' => '{{old_expires_at}}',
'Hạn sử dụng mới' => '{{expires_at}}',
'Hoá đơn' => '{{invoice_number}}',
'Số tiền' => '{{amount_formatted}}',
'Thanh toán' => '{{payment_method_label}}',
]),
],
[
'scenario' => 'admin_order_notification',
'name' => '[Admin] Đơn hàng mới',
'subject' => '[ADMIN] Đơn hàng mới #{{order_num}} — {{customer_email}}',
'body' => T::title('Đơn hàng mới')
. T::paragraph('Có đơn hàng mới vừa được đặt trên hệ thống <strong>{{company_name}}</strong>.')
. T::heading('Thông tin khách hàng')
. T::infoTable([
'Mã đơn hàng' => '#{{order_num}}',
'Thời gian' => '{{created_at}}',
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
], '{{client_ip_row}}')
. T::heading('Thông tin sản phẩm')
. T::infoTable([
'Sản phẩm' => '{{product_name}}',
'Loại' => '{{product_type}}',
'Chu kỳ thanh toán' => '{{billing_cycle}}',
'Tổng tiền' => '{{total_formatted}}',
])
. '{{vm_block}}',
],
[
'scenario' => 'admin_domain_order_new',
'name' => '[Admin] Đơn đăng ký tên miền mới',
'subject' => '[ADMIN] Đơn đăng ký tên miền mới - {{domain_name}}',
'body' => T::title('Đơn đăng ký tên miền mới')
. T::paragraph('Có đơn đăng ký tên miền mới trên hệ thống <strong>{{company_name}}</strong>, cần kiểm tra và đăng ký thủ công.')
. T::infoTable([
'Tên miền' => '{{domain_name}}',
'Mã đơn hàng' => '{{order_num}}',
'Tổng tiền' => '{{order_total}}',
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
'Thời gian' => '{{created_at}}',
])
. T::button('{{admin_url}}', 'XEM ĐƠN HÀNG'),
],
[
'scenario' => 'admin_hosting_account_created',
'name' => '[Admin] Hosting account mới',
'subject' => '[ADMIN] Hosting account mới — {{domain_name}}',
'body' => T::title('Hosting account mới')
. T::paragraph('Hệ thống <strong>{{company_name}}</strong> vừa khởi tạo hosting cho khách hàng.')
. T::heading('Thông tin dịch vụ')
. T::infoTable([
'Tên miền' => '{{domain_name}}',
'Gói hosting' => '{{hosting_plan}}',
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
'Thời gian' => '{{created_at}}',
])
. T::heading('Máy chủ Plesk')
. T::infoTable([
'Máy chủ' => '{{server_name}}',
'IP' => '{{server_ip}}',
'Client ID' => '{{plesk_client_id}}',
'Subscription ID' => '{{plesk_subscription_id}}',
])
. T::heading('Thông tin truy cập')
. T::infoTable(
['FTP Username' => '{{ftp_username}}'],
'{{ftp_password_row}}'
. T::row('Plesk Panel', '{{plesk_panel_url}}')
. T::row('Plesk Login', '{{plesk_login}}')
. '{{plesk_password_row}}',
),
],
[
'scenario' => 'admin_trial_registration_request',
'name' => '[Admin] Yêu cầu dùng thử VPS',
'subject' => '[ADMIN] Yêu cầu dùng thử Cloud VPS - {{customer_name}}',
'body' => T::title('Yêu cầu dùng thử Cloud VPS')
. T::paragraph('Có khách hàng vừa gửi yêu cầu dùng thử Cloud VPS trên hệ thống <strong>{{company_name}}</strong>.')
. T::heading('Thông tin khách hàng')
. T::infoTable([
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
'Số điện thoại' => '{{customer_phone}}',
'Thời gian' => '{{created_at}}',
])
. T::heading('Cấu hình yêu cầu')
. T::infoTable([
'CPU' => '{{cpu}}',
'RAM' => '{{ram}}',
'SSD' => '{{ssd}}',
'Hệ điều hành' => '{{os}}',
], '{{other_row}}'),
],
[
'scenario' => 'admin_manual_deposit_pending',
'name' => '[Admin] Yêu cầu nạp tiền chờ duyệt',
'subject' => '[ADMIN] Yêu cầu nạp tiền chờ duyệt - {{transaction_code}}',
'body' => T::title('Yêu cầu nạp tiền chờ duyệt')
. T::paragraph('Có yêu cầu nạp tiền thủ công mới trên hệ thống <strong>{{company_name}}</strong>, vui lòng kiểm tra chứng từ và duyệt trong trang quản trị.')
. T::infoTable([
'Mã giao dịch' => '{{transaction_code}}',
'Số tiền' => '<span style="color: #f16723;">{{amount_formatted}}</span>',
'Thời gian' => '{{created_at}}',
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
], '{{customer_phone_row}}{{client_ip_row}}{{proof_row}}'),
],
[
'scenario' => 'admin_ticket_notification',
'name' => '[Admin] Ticket hỗ trợ mới',
'subject' => '[ADMIN] Ticket mới #{{ticket_num}} — {{customer_email}}',
'body' => T::title('Ticket hỗ trợ mới')
. T::infoTable([
'Mã ticket' => '#{{ticket_num}}',
'Tiêu đề' => '{{subject_text}}',
'Phòng ban' => '{{room}}',
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
])
. T::note('{{description}}', 'Nội dung:')
. T::button('{{ticket_url}}', 'XEM TICKET'),
],
[
'scenario' => 'admin_customer_service_renewed',
'name' => '[Admin] Khách hàng gia hạn dịch vụ',
'subject' => '[ADMIN] {{customer_name}} gia hạn dịch vụ {{product_name}}',
'body' => T::title('Khách hàng vừa gia hạn dịch vụ')
. T::paragraph('Một dịch vụ trên hệ thống <strong>{{company_name}}</strong> vừa được gia hạn thành công.')
. T::infoTable([
'Hình thức' => '{{renewal_source_label}}',
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
'Dịch vụ' => '{{product_name}}{{server_name_suffix}}',
'Thời gian gia hạn' => '{{months_label}}',
'Hạn sử dụng trước' => '{{old_expires_at}}',
'Hạn sử dụng mới' => '{{expires_at}}',
'Hoá đơn' => '{{invoice_number}}',
'Số tiền' => '{{amount_formatted}}',
'Thanh toán' => '{{payment_method_label}}',
])
. T::button('{{admin_url}}', 'XEM DỊCH VỤ'),
],
[
'scenario' => 'admin_service_cancellation_request',
'name' => '[Admin] Khách yêu cầu hủy dịch vụ',
'subject' => '[ADMIN] {{customer_name}} yêu cầu hủy dịch vụ {{product_name}}',
'body' => T::title('Khách hàng yêu cầu hủy dịch vụ')
. T::paragraph('Khách hàng vừa gửi yêu cầu hủy dịch vụ trên hệ thống <strong>{{company_name}}</strong>. Dịch vụ chưa bị hủy, cần nhân viên liên hệ và xử lý.')
. T::infoTable([
'Khách hàng' => '{{customer_name}}',
'Email' => '{{customer_email}}',
'Dịch vụ' => '{{product_name}}',
'Tên dịch vụ' => '{{server_name}}',
'Ngày hết hạn' => '{{expires_at}}',
'Lý do hủy' => '{{cancel_reason}}',
'Thời gian' => '{{created_at}}',
'Địa chỉ IP' => '{{client_ip}}',
])
. T::button('{{admin_url}}', 'XEM DỊCH VỤ'),
],
[
'scenario' => 'admin_login_alert',
'name' => '[Admin] Có người đăng nhập trang quản trị',
'subject' => '[ADMIN] {{admin_username}} đăng nhập trang quản trị từ IP {{client_ip}}',
'body' => T::title('Có người vừa đăng nhập trang quản trị')
. T::paragraph('Tài khoản quản trị trên hệ thống <strong>{{company_name}}</strong> vừa đăng nhập thành công.')
. T::infoTable([
'Nhân viên' => '{{admin_name}}',
'Tài khoản' => '{{admin_username}}',
'Thời gian' => '{{login_time}}',
'Địa chỉ IP' => '{{client_ip}}',
'Trình duyệt' => '{{user_agent}}',
])
. T::note('Nếu đây không phải nhân sự của công ty, hãy đổi mật khẩu tài khoản này và khoá tài khoản ngay trong mục Nhân sự.', 'Lưu ý:'),
],
];
}
}