feat: nạp tiền thủ công mã 30 phút, gia hạn trừ số dư, đồng bộ domain từ Plesk

- Nạp tiền: mã thanh toán sống 30 phút (ManualDepositDraft), khôi phục/huỷ mã, lệnh dọn mã hết hạn; total_pending chỉ tính giao dịch đã nộp chứng từ, admin duyệt/từ chối/xoá giao dịch
- Gia hạn dịch vụ: phát hành invoice gia hạn trên order gốc và trừ số dư ngay
- Đồng bộ domain từ Plesk theo server, ServiceOrderRecorder tạo order/invoice cho dịch vụ admin dựng
- Danh sách dịch vụ trả field theo loại (service_plan, dns_records_count), đếm dịch vụ theo loại

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
baodev0
2026-10-11 23:07:51 +07:00
co-authored by Claude Opus 5.5
parent 10af41c5cf
commit c5115b52dd
53 changed files with 1887 additions and 613 deletions
@@ -36,6 +36,22 @@ class ServiceController extends Controller
$this->activityLogger = $activityLogger;
}
public function index(Request $request): JsonResponse
{
$customer = $request->user();
$services = $this->serviceClientService->getActiveServices($customer->id, null, null);
$this->serviceClientService->attachDnsRecordCounts($services, $customer->id);
return (new VpsServiceCollection($services))
->additional([
'error' => false,
'message' => 'Lấy dữ liệu thành công',
'page_type' => 'services',
])
->response();
}
public function indexVps(Request $request): JsonResponse
{
$perPage = min((int) $request->get('per_page', 15), 100);
@@ -123,6 +139,7 @@ class ServiceController extends Controller
$customerId = (int) $request->user()->id;
$services = $this->serviceClientService->getActiveServices($customerId, null, 5);
$this->serviceClientService->attachDnsRecordCounts($services, $customerId);
$invoices = $orderQueryService->getCustomerInvoices($customerId)->take(5);
return response()->json([
@@ -131,6 +148,7 @@ class ServiceController extends Controller
'data' => [
'services' => (new VpsServiceCollection($services))->collection,
'invoices' => InvoiceSummaryResource::collection($invoices),
'counts' => $this->serviceClientService->countByType($customerId),
],
]);
}