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>
This commit is contained in:
baodev0
2026-10-28 16:40:24 +07:00
co-authored by Claude Sonnet 5.5
parent a6b641015e
commit b44a88bb52
72 changed files with 1701 additions and 231 deletions
@@ -166,6 +166,44 @@ final class AdminTemplates
. 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ị',