diff --git a/app/Http/Controllers/Api/Admin/Hosting/ServicePlanController.php b/app/Http/Controllers/Api/Admin/Hosting/ServicePlanController.php
new file mode 100644
index 0000000..456dabf
--- /dev/null
+++ b/app/Http/Controllers/Api/Admin/Hosting/ServicePlanController.php
@@ -0,0 +1,119 @@
+orderBy('title')->get();
+
+ return response()->json(['error' => false, 'data' => $plans]);
+ }
+
+ public function show(int $id): JsonResponse
+ {
+ $plan = ServicePlan::with('plesk')->find($id);
+
+ if (!$plan) {
+ return response()->json(['error' => true, 'message' => 'Không tìm thấy gói hosting.'], 404);
+ }
+
+ return response()->json(['error' => false, 'data' => $plan]);
+ }
+
+ public function store(Request $request): JsonResponse
+ {
+ $validated = $request->validate([
+ 'title' => 'required|string|max:255',
+ 'vcpu' => 'required|integer|min:0',
+ 'ram' => 'required|integer|min:0',
+ 'disk' => 'required|integer|min:0',
+ 'domain' => 'required|integer|min:0',
+ 'plesk_plan_name' => 'nullable|string|max:255',
+ 'note' => 'nullable|string',
+ ]);
+
+ $plan = ServicePlan::create([
+ 'title' => $validated['title'],
+ 'vcpu' => $validated['vcpu'],
+ 'ram' => $validated['ram'],
+ 'disk' => $validated['disk'],
+ 'domain' => $validated['domain'],
+ ]);
+
+ $this->savePlesk($plan, $validated);
+
+ return response()->json([
+ 'error' => false,
+ 'message' => 'Tạo gói hosting thành công.',
+ 'data' => $plan->load('plesk'),
+ ], 201);
+ }
+
+ public function update(Request $request, int $id): JsonResponse
+ {
+ $plan = ServicePlan::find($id);
+
+ if (!$plan) {
+ return response()->json(['error' => true, 'message' => 'Không tìm thấy gói hosting.'], 404);
+ }
+
+ $validated = $request->validate([
+ 'title' => 'required|string|max:255',
+ 'vcpu' => 'required|integer|min:0',
+ 'ram' => 'required|integer|min:0',
+ 'disk' => 'required|integer|min:0',
+ 'domain' => 'required|integer|min:0',
+ 'plesk_plan_name' => 'nullable|string|max:255',
+ 'note' => 'nullable|string',
+ ]);
+
+ $plan->update([
+ 'title' => $validated['title'],
+ 'vcpu' => $validated['vcpu'],
+ 'ram' => $validated['ram'],
+ 'disk' => $validated['disk'],
+ 'domain' => $validated['domain'],
+ ]);
+
+ $this->savePlesk($plan, $validated);
+
+ return response()->json([
+ 'error' => false,
+ 'message' => 'Cập nhật gói hosting thành công.',
+ 'data' => $plan->fresh('plesk'),
+ ]);
+ }
+
+ public function destroy(int $id): JsonResponse
+ {
+ $plan = ServicePlan::find($id);
+
+ if (!$plan) {
+ return response()->json(['error' => true, 'message' => 'Không tìm thấy gói hosting.'], 404);
+ }
+
+ $plan->delete();
+
+ return response()->json(['error' => false, 'message' => 'Xoá gói hosting thành công.']);
+ }
+
+ private function savePlesk(ServicePlan $plan, array $data): void
+ {
+ if (empty($data['plesk_plan_name'])) {
+ $plan->plesk()->delete();
+ return;
+ }
+
+ $plan->plesk()->updateOrCreate(
+ ['service_plan_id' => $plan->id],
+ ['plesk_plan_name' => $data['plesk_plan_name'], 'note' => $data['note'] ?? null]
+ );
+ }
+}
diff --git a/app/Http/Controllers/Api/Admin/Product/ProductController.php b/app/Http/Controllers/Api/Admin/Product/ProductController.php
index 910496b..1630d58 100644
--- a/app/Http/Controllers/Api/Admin/Product/ProductController.php
+++ b/app/Http/Controllers/Api/Admin/Product/ProductController.php
@@ -62,6 +62,7 @@ class ProductController extends Controller
$validated = $request->validate([
'name' => 'required|string|max:255',
'product_categories_id' => 'nullable|integer|exists:product_categories,id',
+ 'service_plan_id' => 'nullable|integer|exists:service_plans,id',
'product_type' => 'nullable|string',
'category' => 'nullable|string|max:255',
'thumbnail' => 'nullable|string|max:2048',
@@ -93,6 +94,7 @@ class ProductController extends Controller
'name' => $validated['name'],
'slug' => Str::slug($validated['name']),
'product_categories_id' => $validated['product_categories_id'] ?? null,
+ 'service_plan_id' => $validated['service_plan_id'] ?? null,
'product_type' => $productType,
'thumbnail' => ($validated['thumbnail'] ?? null) ?: null,
'is_active' => $validated['is_active'] ?? true,
@@ -124,6 +126,7 @@ class ProductController extends Controller
$validated = $request->validate([
'name' => 'sometimes|required|string|max:255',
'product_categories_id' => 'nullable|integer|exists:product_categories,id',
+ 'service_plan_id' => 'nullable|integer|exists:service_plans,id',
'product_type' => 'nullable|string',
'thumbnail' => 'nullable|string|max:2048',
'is_active' => 'boolean',
diff --git a/app/Http/Controllers/Api/Service/OrderControllerRefactor.php b/app/Http/Controllers/Api/Service/OrderControllerRefactor.php
index 8682584..0cca618 100644
--- a/app/Http/Controllers/Api/Service/OrderControllerRefactor.php
+++ b/app/Http/Controllers/Api/Service/OrderControllerRefactor.php
@@ -105,18 +105,14 @@ class OrderControllerRefactor extends Controller
}
}
- public function payOrder(int $id, PayOrderRequest $request): JsonResponse
+ public function payOrder(string $orderNum, PayOrderRequest $request): JsonResponse
{
- $order = $this->orderRepository->find($id);
+ $order = $this->orderRepository->findByOrderNum($orderNum, (int) $request->user()->id);
if (! $order) {
return response()->json(['success' => false, 'message' => 'Đơn hàng không tồn tại.'], 404);
}
- if ($order->customer_id !== $request->user()->id) {
- return response()->json(['success' => false, 'message' => 'Không có quyền truy cập.'], 403);
- }
-
$this->orderService->pay($order, $request->payment_method);
$this->activityLogger->log(
@@ -180,6 +176,8 @@ class OrderControllerRefactor extends Controller
return response()->json(['success' => false, 'message' => 'Hóa đơn không tồn tại.'], 404);
}
+ $order->load('vmWare.os.osGroup', 'vmWare.virtualMachine', 'vmWare.service');
+
return response()->json(['success' => true, 'data' => new InvoiceDetailResource($order->invoice->setRelation('order', $order))]);
}
diff --git a/app/Http/Resources/Api/Admin/ProductResource.php b/app/Http/Resources/Api/Admin/ProductResource.php
index d84a1c3..58ca8cd 100644
--- a/app/Http/Resources/Api/Admin/ProductResource.php
+++ b/app/Http/Resources/Api/Admin/ProductResource.php
@@ -27,6 +27,7 @@ class ProductResource extends JsonResource
'page_type' => $this->resolvePageType($this->product_type),
'product_categories_id' => $this->whenLoaded('category', fn() => $this->category?->id),
'category' => $this->whenLoaded('category', fn() => $this->category?->name),
+ 'service_plan_id' => $this->service_plan_id,
'cpu' => $this->cpu,
'ram' => $this->ram,
'disk' => $this->disk,
diff --git a/app/Http/Resources/Api/Service/Order/InvoiceDetailResource.php b/app/Http/Resources/Api/Service/Order/InvoiceDetailResource.php
index d4e8881..dddf373 100644
--- a/app/Http/Resources/Api/Service/Order/InvoiceDetailResource.php
+++ b/app/Http/Resources/Api/Service/Order/InvoiceDetailResource.php
@@ -13,7 +13,6 @@ class InvoiceDetailResource extends JsonResource
public function toArray(Request $request): array
{
return [
- 'id' => $this->id,
'invoice_number' => $this->invoice_number,
'invoice_type' => $this->invoice_type,
'status' => $this->status,
@@ -28,18 +27,15 @@ class InvoiceDetailResource extends JsonResource
'due_date' => $this->due_date?->toISOString(),
'paid_at' => $this->paid_at?->toISOString(),
'customer' => $this->whenLoaded('customer', fn () => [
- 'id' => $this->customer->id,
'name' => $this->customer->fullname,
'email' => $this->customer->email,
'address' => $this->customer->address,
]),
'order' => $this->whenLoaded('order', fn () => [
- 'id' => $this->order->id,
'order_num' => $this->order->order_num,
'total' => (float) $this->order->total,
]),
'items' => $this->whenLoaded('order', fn () => $this->order->orderItems->map(fn ($item) => [
- 'id' => $item->id,
'product_name' => $item->product?->name,
'server_name' => $item->server_name,
'billing_cycle' => $item->billing_cycle,
@@ -48,11 +44,36 @@ class InvoiceDetailResource extends JsonResource
'os_id' => $item->os_id,
])->values()->all()),
'attachments' => $this->whenLoaded('attachments', fn () => $this->attachments->map(fn ($a) => [
- 'id' => $a->id,
'filename' => $a->filename,
'url' => $a->url,
'mime_type' => $a->mime_type,
])->all()),
+ 'vmware' => $this->when(
+ $this->order?->relationLoaded('vmWare') && $this->order->vmWare->isNotEmpty(),
+ fn () => $this->resolveVmware($this->order->vmWare->first()),
+ ),
+ ];
+ }
+
+ private function resolveVmware(\App\Models\ModuleVmware $vm): array
+ {
+ return [
+ 'id' => $vm->id,
+ 'uuid' => $vm->service?->uuid,
+ 'name' => $vm->name,
+ 'hostname' => $vm->hostname,
+ 'ip_address' => $vm->ip,
+ 'os_name' => $vm->os?->name,
+ 'status' => $vm->status,
+ 'username' => $vm->user,
+ 'port' => $vm->port,
+ 'power_state' => match ($vm->virtualMachine?->power_state) {
+ 'POWERED_ON' => 'poweredOn',
+ 'POWERED_OFF' => 'poweredOff',
+ 'SUSPENDED' => 'suspended',
+ default => null,
+ },
+ 'next_due_date' => $vm->next_due_date ? \Illuminate\Support\Carbon::createFromTimestamp($vm->next_due_date)->toISOString() : null,
];
}
}
diff --git a/app/Models/ModuleVmware.php b/app/Models/ModuleVmware.php
index 39dc86d..aa82429 100644
--- a/app/Models/ModuleVmware.php
+++ b/app/Models/ModuleVmware.php
@@ -70,6 +70,10 @@ class ModuleVmware extends Model
{
return $this->belongsTo(\App\Models\Order::class);
}
+ public function virtualMachine()
+ {
+ return $this->hasOne(\App\Models\VirtualMachines::class, 'vm_id', 'vmware_id');
+ }
public function services()
{
diff --git a/app/Models/Product.php b/app/Models/Product.php
index e26af55..8622daa 100644
--- a/app/Models/Product.php
+++ b/app/Models/Product.php
@@ -34,6 +34,7 @@ class Product extends Model
'is_active',
'sort_order',
'product_categories_id',
+ 'service_plan_id',
'module_ip_address',
'module_host_id',
'module_datastore_id',
@@ -70,6 +71,11 @@ class Product extends Model
return $this->belongsTo(ProductCategories::class, 'product_categories_id');
}
+ public function servicePlan()
+ {
+ return $this->belongsTo(ServicePlan::class);
+ }
+
/**
* Relationship: Product has many OS versions (pivot table: os_product)
*/
diff --git a/app/Models/ServicePlan.php b/app/Models/ServicePlan.php
new file mode 100644
index 0000000..fc5ef6c
--- /dev/null
+++ b/app/Models/ServicePlan.php
@@ -0,0 +1,21 @@
+hasOne(ServicePlanPlesk::class);
+ }
+}
diff --git a/app/Models/ServicePlanPlesk.php b/app/Models/ServicePlanPlesk.php
new file mode 100644
index 0000000..3595d98
--- /dev/null
+++ b/app/Models/ServicePlanPlesk.php
@@ -0,0 +1,21 @@
+belongsTo(ServicePlan::class);
+ }
+}
diff --git a/app/Repositories/Api/Order/OrderRepository.php b/app/Repositories/Api/Order/OrderRepository.php
index f071646..98e6903 100644
--- a/app/Repositories/Api/Order/OrderRepository.php
+++ b/app/Repositories/Api/Order/OrderRepository.php
@@ -61,6 +61,15 @@ class OrderRepository extends BaseApiRepository implements OrderRepositoryInterf
return $this->model->where('customer_id', $customerId)->where('status', OrderStatus::PENDING->value)->exists();
}
+ // -------------------------------------------------------------------------
+ // findByOrderNum
+ // -------------------------------------------------------------------------
+
+ public function findByOrderNum(string $orderNum, int $customerId): ?Order
+ {
+ return $this->model->where('order_num', $orderNum)->where('customer_id', $customerId)->first();
+ }
+
// -------------------------------------------------------------------------
// getOrders
// -------------------------------------------------------------------------
diff --git a/app/Repositories/Api/Order/OrderRepositoryInterface.php b/app/Repositories/Api/Order/OrderRepositoryInterface.php
index ad0add0..1960610 100644
--- a/app/Repositories/Api/Order/OrderRepositoryInterface.php
+++ b/app/Repositories/Api/Order/OrderRepositoryInterface.php
@@ -29,4 +29,9 @@ interface OrderRepositoryInterface extends BaseRepositoryInterface
* Paginated order list for a customer, with optional filters.
*/
public function getOrders(int $customerId, array $filters): LengthAwarePaginator;
+
+ /**
+ * Find an order by order_num, scoped to the owning customer.
+ */
+ public function findByOrderNum(string $orderNum, int $customerId): ?Order;
}
diff --git a/database/migrations/2026_08_11_094051_create_service_plans_table.php b/database/migrations/2026_08_11_094051_create_service_plans_table.php
new file mode 100644
index 0000000..9278c91
--- /dev/null
+++ b/database/migrations/2026_08_11_094051_create_service_plans_table.php
@@ -0,0 +1,26 @@
+id();
+ $table->string('title');
+ $table->unsignedInteger('vcpu');
+ $table->unsignedInteger('ram');
+ $table->unsignedInteger('disk');
+ $table->unsignedInteger('domain');
+ $table->timestamps();
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('service_plans');
+ }
+};
diff --git a/database/migrations/2026_08_11_094052_create_service_plan_plesk_table.php b/database/migrations/2026_08_11_094052_create_service_plan_plesk_table.php
new file mode 100644
index 0000000..fc4ae60
--- /dev/null
+++ b/database/migrations/2026_08_11_094052_create_service_plan_plesk_table.php
@@ -0,0 +1,26 @@
+id();
+ $table->unsignedBigInteger('service_plan_id')->unique();
+ $table->string('plesk_plan_name');
+ $table->text('note')->nullable();
+ $table->timestamps();
+
+ $table->foreign('service_plan_id')->references('id')->on('service_plans')->onDelete('cascade');
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('service_plan_plesk');
+ }
+};
diff --git a/database/migrations/2026_08_11_094053_add_service_plan_id_to_products_table.php b/database/migrations/2026_08_11_094053_add_service_plan_id_to_products_table.php
new file mode 100644
index 0000000..69d95b3
--- /dev/null
+++ b/database/migrations/2026_08_11_094053_add_service_plan_id_to_products_table.php
@@ -0,0 +1,24 @@
+unsignedBigInteger('service_plan_id')->nullable()->after('product_categories_id');
+ $table->foreign('service_plan_id')->references('id')->on('service_plans')->nullOnDelete();
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::table('products', function (Blueprint $table) {
+ $table->dropForeign(['service_plan_id']);
+ $table->dropColumn('service_plan_id');
+ });
+ }
+};
diff --git a/resources/views/emails/customer/holiday-notice.blade.php b/resources/views/emails/customer/holiday-notice.blade.php
index e3c44ab..0c90845 100644
--- a/resources/views/emails/customer/holiday-notice.blade.php
+++ b/resources/views/emails/customer/holiday-notice.blade.php
@@ -2,7 +2,7 @@
$heroImage = $heroImage ?? 'https://client.tgs.com.vn/index.php?rp=/images/em/368_30.4-CP.png';
$ticketUrl = $ticketUrl ?? 'https://client.tgs.com.vn/submitticket.php?step=2&deptid=5';
$supportEmail = $supportEmail ?? 'Support@tgs.com.vn';
- $hotline = $hotline ?? '1900. 6119';
+ $hotline = $hotline ?? '(028) 7309. 7379';
$holidayName = $holidayName ?? 'ngày Giải phóng miền Nam 30/4 và ngày Quốc tế Lao động 1/5';
$holidayFrom = $holidayFrom ?? 'Thứ Năm, ngày 30/04/2026';
$holidayTo = $holidayTo ?? 'Thứ Hai, ngày 04/05/2026';
@@ -150,7 +150,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $hotline }}
+ Tel: {{ $hotline }}
Email: Support@tgs.com.vn
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/hosting-account-created.blade.php b/resources/views/emails/customer/hosting-account-created.blade.php
index dffcb21..5b075d1 100644
--- a/resources/views/emails/customer/hosting-account-created.blade.php
+++ b/resources/views/emails/customer/hosting-account-created.blade.php
@@ -11,7 +11,7 @@
$pleskPanelUrl = $pleskPanelUrl ?? '';
$loginUrl = $loginUrl ?? rtrim(config('app.frontend_url', ''), '/') . '/dang-nhap';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -196,7 +196,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/password-reset-admin.blade.php b/resources/views/emails/customer/password-reset-admin.blade.php
index dfdda04..25d10f5 100644
--- a/resources/views/emails/customer/password-reset-admin.blade.php
+++ b/resources/views/emails/customer/password-reset-admin.blade.php
@@ -5,7 +5,7 @@
$password = $password ?? '';
$loginUrl = $loginUrl ?? rtrim(config('app.frontend_url', ''), '/') . '/dang-nhap';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -153,7 +153,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/snapshot-action.blade.php b/resources/views/emails/customer/snapshot-action.blade.php
index f74157c..9740a40 100644
--- a/resources/views/emails/customer/snapshot-action.blade.php
+++ b/resources/views/emails/customer/snapshot-action.blade.php
@@ -7,7 +7,7 @@
$actionAt = $actionAt ?? now()->format('d/m/Y H:i:s');
$loginUrl = $loginUrl ?? rtrim(config('app.frontend_url', ''), '/') . '/dang-nhap';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
$actionLabels = [
'create' => ['icon' => '📸', 'title' => 'Tạo Snapshot thành công', 'desc' => 'Snapshot máy chủ ảo của bạn đã được tạo thành công', 'status' => 'Tạo thành công ✓'],
@@ -167,7 +167,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/ticket-created.blade.php b/resources/views/emails/customer/ticket-created.blade.php
index 3582c47..8eba526 100644
--- a/resources/views/emails/customer/ticket-created.blade.php
+++ b/resources/views/emails/customer/ticket-created.blade.php
@@ -2,7 +2,7 @@
$appName = $appName ?? config('app.name', 'Thế Giới Số');
$fullName = $fullName ?? 'Quý khách';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -174,7 +174,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/verify-account-welcome.blade.php b/resources/views/emails/customer/verify-account-welcome.blade.php
index 848ba61..d961f42 100644
--- a/resources/views/emails/customer/verify-account-welcome.blade.php
+++ b/resources/views/emails/customer/verify-account-welcome.blade.php
@@ -3,7 +3,7 @@
$fullName = $fullName ?? 'Quý khách';
$verifyCode = $verifyCode ?? '';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -143,7 +143,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/vm-creation-failed.blade.php b/resources/views/emails/customer/vm-creation-failed.blade.php
index d1418c3..cbb6753 100644
--- a/resources/views/emails/customer/vm-creation-failed.blade.php
+++ b/resources/views/emails/customer/vm-creation-failed.blade.php
@@ -5,7 +5,7 @@
$productName = $productName ?? 'N/A';
$invoiceUrl = $invoiceUrl ?? rtrim((string) env('FRONTEND_URL', config('app.url')), '/') . '/hoa-don';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -149,7 +149,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/vm-password-changed.blade.php b/resources/views/emails/customer/vm-password-changed.blade.php
index e3a1322..7ebef3e 100644
--- a/resources/views/emails/customer/vm-password-changed.blade.php
+++ b/resources/views/emails/customer/vm-password-changed.blade.php
@@ -5,7 +5,7 @@
$newPassword = $newPassword ?? '';
$loginUrl = $loginUrl ?? rtrim(config('app.frontend_url', ''), '/') . '/dang-nhap';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -159,7 +159,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/vm-rebuild-failed.blade.php b/resources/views/emails/customer/vm-rebuild-failed.blade.php
index 7ce2784..efe451c 100644
--- a/resources/views/emails/customer/vm-rebuild-failed.blade.php
+++ b/resources/views/emails/customer/vm-rebuild-failed.blade.php
@@ -5,7 +5,7 @@
$ip = $ip ?? 'N/A';
$serviceUrl = $serviceUrl ?? rtrim((string) env('FRONTEND_URL', config('app.url')), '/') . '/dich-vu';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -86,7 +86,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/resources/views/emails/customer/welcome.blade.php b/resources/views/emails/customer/welcome.blade.php
index 90acecf..1edf35f 100644
--- a/resources/views/emails/customer/welcome.blade.php
+++ b/resources/views/emails/customer/welcome.blade.php
@@ -3,7 +3,7 @@
$fullName = $fullName ?? 'Quý khách';
$loginUrl = $loginUrl ?? rtrim(config('app.frontend_url', ''), '/') . '/dang-nhap';
$supportEmail = $supportEmail ?? 'support@tgs.com.vn';
- $supportPhone = $supportPhone ?? '1900. 6119';
+ $supportPhone = $supportPhone ?? '(028) 7309. 7379';
@endphp
@@ -146,7 +146,7 @@
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
Địa chỉ: 128/38 Tân Hương, Phường Phú Thọ Hòa, Thành Phố Hồ Chí Minh
- Tel: (028) 7309. 7379 - Tổng đài: {{ $supportPhone }}
+ Tel: {{ $supportPhone }}
Email: {{ $supportEmail }}
www.TGS.com.vn &
diff --git a/routes/api.php b/routes/api.php
index ff26e12..d1f1556 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -28,6 +28,7 @@ use App\Http\Controllers\Api\Admin\DnsManager\RecordController as DnsRecordContr
use App\Http\Controllers\Api\Admin\Hosting\HostingAccountController;
use App\Http\Controllers\Api\Admin\OsManager\OsGroupController;
use App\Http\Controllers\Api\Admin\OsManager\OsController;
+use App\Http\Controllers\Api\Admin\Hosting\ServicePlanController;
use App\Http\Controllers\Api\Admin\IpPool\IpPoolController;
use App\Http\Controllers\Api\Admin\Bank\BankController;
use App\Http\Controllers\Api\Admin\EmailTemplate\EmailTemplateController;
@@ -435,6 +436,18 @@ Route::prefix('v1')
Route::post('{id}/reset-ftp-password', 'resetFtpPassword')->middleware('perm:hosting.edit');
});
+ // Service Plans — hosting package configs (module: hosting)
+ Route::prefix('service-plans')
+ ->controller(ServicePlanController::class)
+ ->as('service-plans.')
+ ->group(function () {
+ Route::get('/', 'index')->middleware('perm:hosting.view')->name('index');
+ Route::post('/', 'store')->middleware('perm:hosting.create')->name('store');
+ Route::get('{id}', 'show')->middleware('perm:hosting.view')->name('show');
+ Route::put('{id}', 'update')->middleware('perm:hosting.edit')->name('update');
+ Route::delete('{id}', 'destroy')->middleware('perm:hosting.destroy')->name('destroy');
+ });
+
// InfraManagement (jumphost, vcenter config)
Route::prefix('infra-management')
->controller(InfraManagementController::class)
diff --git a/routes/client.php b/routes/client.php
index 809bd64..190c077 100644
--- a/routes/client.php
+++ b/routes/client.php
@@ -171,7 +171,7 @@ Route::prefix('v1')
Route::get('/', 'getList')->name('list');
Route::get('check-server-name', 'checkServerName')->name('check-server-name');
Route::post('/', 'storeOrder')->name('store');
- Route::post('{id}/pay', 'payOrder')->name('pay');
+ Route::post('{orderNum}/pay', 'payOrder')->name('pay');
});
});