domainOrderService->placeOrder($request->validated(), $request->user()); $this->notifyDomainOrderPlaced($request->user(), $result); return response()->json([ 'success' => true, 'message' => 'Đặt mua tên miền thành công.', 'notice' => 'Việc đặt mua không đồng nghĩa tên miền đã được đăng ký thành công. Đơn hàng sẽ được nhân viên kiểm tra và xử lý. Nếu tên miền không còn khả dụng, số dư đã thanh toán sẽ được hoàn lại vào tài khoản.', 'data' => [ 'order_num' => $result['order']->order_num, 'domain_name' => $result['order']->orderItems->first()?->domain_name, 'status' => 'pending', 'total' => $result['invoice']->total, 'invoice_number' => $result['invoice']->invoice_number, ], ], 201); } catch (\InvalidArgumentException $e) { return response()->json([ 'success' => false, 'message' => $e->getMessage(), ], 422); } catch (\Throwable $e) { Log::error('DomainOrderController@store', [ 'error' => $e->getMessage(), 'customer_id' => $request->user()?->id, 'data' => $request->validated(), ]); return response()->json([ 'success' => false, 'message' => 'Đặt mua tên miền thất bại. Vui lòng thử lại.', ], 500); } } private function notifyDomainOrderPlaced(Customer $customer, array $result): void { $domainName = $result['order']->orderItems->first()?->domain_name ?? ''; $orderNum = $result['order']->order_num; $total = number_format((int) $result['invoice']->total) . ' VNĐ'; $createdAt = now()->format('d/m/Y H:i:s'); Notification::notifyAdmins([ 'type' => 'domain_order_new', 'title' => 'Đơn đăng ký tên miền mới', 'body' => "Khách hàng {$customer->fullname} vừa đặt mua tên miền {$domainName} (#{$orderNum})", 'link' => '/domain-orders/' . $result['order']->id, 'data' => [ 'order_id' => $result['order']->id, 'order_num' => $orderNum, ], ]); $setting = Setting::where('key', 'setting')->first(); $settingValue = $setting ? json_decode((string) $setting->value, true) : []; $companyName = $settingValue['company'] ?? config('app.name'); $adminEmail = $settingValue['admin_email'] ?? null; $mailData = [ 'company_name' => $companyName, 'domain_name' => $domainName, 'customer_name' => $customer->fullname, 'customer_email' => $customer->email, 'order_num' => $orderNum, 'order_total' => $total, 'created_at' => $createdAt, ]; if (!empty($adminEmail)) { try { $adminUrl = rtrim(env('ADMIN_URL', config('app.url')), '/') . '/domain-orders'; Mail::to($adminEmail)->send( new DomainOrderNewNotification([...$mailData, 'admin_url' => $adminUrl]) ); } catch (\Throwable $e) { Log::error('DomainOrderController: không thể gửi email admin: ' . $e->getMessage()); } } try { $orderUrl = rtrim(config('app.frontend_url', ''), '/') . '/don-hang'; Mail::to($customer->email)->send( new DomainOrderReceivedNotification([...$mailData, 'order_url' => $orderUrl, 'invoice_id' => $result['invoice']->id]) ); } catch (\Throwable $e) { Log::error('DomainOrderController: không thể gửi email khách hàng: ' . $e->getMessage()); } } }