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'); }); });