From 5c04a9579271560391c55a292774077f07409e1c Mon Sep 17 00:00:00 2001 From: Juan Felipe Duarte <70235683+DuarteJFelipe@users.noreply.github.com> Date: Wed, 15 Oct 2025 16:43:43 -0500 Subject: [PATCH] update codigo referido funcionamiento login, register y dashboard --- .../Auth/RegisteredUserController.php | 65 +++- app/Http/Livewire/ShareCodeComponent.php | 20 ++ app/Models/User.php | 39 +++ ...948_add_referral_fields_to_users_table.php | 28 ++ resources/views/auth/login.blade.php | 40 ++- resources/views/auth/register.blade.php | 125 +++++--- resources/views/dashboard.blade.php | 14 +- .../livewire/share-code-component.blade.php | 107 +++++++ .../views/livewire/show-promociones.blade.php | 285 ++++++++---------- .../views/livewire/show-usuarios.blade.php | 6 +- 10 files changed, 490 insertions(+), 239 deletions(-) create mode 100644 app/Http/Livewire/ShareCodeComponent.php create mode 100644 database/migrations/2025_10_15_095948_add_referral_fields_to_users_table.php create mode 100644 resources/views/livewire/share-code-component.blade.php diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 487fedb..249fc9b 100755 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Models\Role; +use App\Models\Saldo; use App\Models\User; use App\Providers\RouteServiceProvider; use Illuminate\Auth\Events\Registered; @@ -13,36 +15,69 @@ use Illuminate\Validation\Rules; class RegisteredUserController extends Controller { - /** - * Display the registration view. - * - * @return \Illuminate\View\View - */ - public function create() + public function create(Request $request) { - return view('auth.register'); + $referralCode = $request->query('ref'); + + return view('auth.register', [ + 'referralCode' => $referralCode, + ]); } - /** - * Handle an incoming registration request. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Illuminate\Validation\ValidationException - */ public function store(Request $request) { $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'confirmed', Rules\Password::defaults()], + 'referral_code' => ['required', 'string'], + ],[ + 'email.unique' => 'El correo electrónico ya está en uso.', + 'email.email' => 'El correo electrónico no es válido.', + 'email.required' => 'El correo electrónico es obligatorio.', + 'name.required' => 'El nombre es obligatorio.', + 'name.string' => 'El nombre debe ser una cadena de texto.', + 'name.max' => 'El nombre no debe exceder los 255 caracteres.', + 'password.required' => 'La contraseña es obligatoria.', + 'password.confirmed' => 'La confirmación de la contraseña no coincide.', + 'password.min' => 'La contraseña debe tener al menos 8 caracteres.', + 'referral_code.required' => 'El código de referido es obligatorio.', + + 'password.confirmed' => 'Las contraseñas no coinciden.', ]); + $referralUser = null; + if ($request->filled('referral_code')) { + $referralUser = User::where('referral_code', $request->referral_code)->first(); + } + + // Determinar el rol del nuevo usuario + if ($referralUser) { + if ($referralUser->rol->nombre === 'super') { + // Si el referido es "super", asignar "cliente" + $rolCliente = Role::where('nombre', 'cliente')->first(); + $rol_id = $rolCliente ? $rolCliente->id : null; + } else { + // Si no es super, tomar el mismo rol del referido + $rol_id = $referralUser->rol_id; + } + } else { + // Si no tiene referral_code, asignar rol por defecto (cliente) + $rolCliente = Role::where('nombre', 'cliente')->first(); + $rol_id = $rolCliente ? $rolCliente->id : null; + } + $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), + 'rol_id' => $rol_id, + 'parent_id' => $referralUser ? $referralUser->id : null, + ]); + + Saldo::create([ + 'usuario_id' => $user->id, + 'valor' => 0, ]); event(new Registered($user)); diff --git a/app/Http/Livewire/ShareCodeComponent.php b/app/Http/Livewire/ShareCodeComponent.php new file mode 100644 index 0000000..3b06132 --- /dev/null +++ b/app/Http/Livewire/ShareCodeComponent.php @@ -0,0 +1,20 @@ +children() + ->select('*') + ->selectRaw('(SELECT COUNT(*) FROM users u WHERE u.parent_id = users.id::text) as children_count') + ->orderBy('created_at', 'desc') + ->get(); + + return view('livewire.share-code-component', compact('referrals')); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 902c8aa..9b024df 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; +use Illuminate\Support\Str; class User extends Authenticatable { @@ -22,6 +23,12 @@ class User extends Authenticatable 'rol_id', 'subvendedor_id', 'subvendedor', + + 'referral_code', + 'parent_id', + + + 'rank_id', ]; protected $hidden = [ @@ -107,4 +114,36 @@ class User extends Authenticatable { return $this->hasMany(User::class, 'subvendedor_id'); } + + // Referral relationships + public function parent() + { + return $this->belongsTo(User::class, 'parent_id'); + } + + public function children() + { + return $this->hasMany(User::class, 'parent_id')->orderBy('created_at', 'desc'); + } + + // public function rank() + // { + // return $this->belongsTo(Rank::class); + // } + + protected static function boot() + { + parent::boot(); + + static::creating(function ($user) { + if (empty($user->referral_code)) { + do { + $code = strtoupper(Str::random(8)); + } while (self::where('referral_code', $code)->exists()); + + $user->referral_code = $code; + } + }); + } + } diff --git a/database/migrations/2025_10_15_095948_add_referral_fields_to_users_table.php b/database/migrations/2025_10_15_095948_add_referral_fields_to_users_table.php new file mode 100644 index 0000000..585a2a2 --- /dev/null +++ b/database/migrations/2025_10_15_095948_add_referral_fields_to_users_table.php @@ -0,0 +1,28 @@ +string('referral_code')->unique()->nullable(); + $table->string('parent_id')->nullable(); + $table->string('rank_id')->nullable(); + }); + } + + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn([ + 'referral_code', + 'parent_id', + 'rank_id', + ]); + }); + } +}; diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index cc90ed4..23f6048 100755 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -1,5 +1,5 @@ - + @@ -10,37 +10,37 @@ @ {{App\Models\Configuracione::Orderby('id','desc')->first()->nombre}} - + @csrf - + {{-- --}} - - + - + {{-- --}} - + - + @@ -48,13 +48,13 @@ {{ __('Recordarme') }} - + {{ __('Iniciar Sesión') }} - + @if (Route::has('password.request')) @@ -62,10 +62,20 @@ @endif + + + + ¿No tienes una cuenta? + + + Crear cuenta + + - - + + - + diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 9dae87f..03d3cbf 100755 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -1,64 +1,91 @@ - - - - - - + - - @csrf - - - - - - - - + + + + + @ {{ App\Models\Configuracione::Orderby('id', 'desc')->first()->nombre }} + - - - + + + @csrf - + + + {{-- --}} - - + - - - + + - + + + {{-- --}} - - + - - - + + - + + + {{-- --}} - - + - - - {{ __('Already registered?') }} - + + - - {{ __('Register') }} - - - - + + + {{-- --}} + + + + + + + + {{-- --}} + + @if (!empty($referralCode)) + + @else + + @endif + + + + + + + + {{ __('Iniciar Sesión') }} + + + + {{ __('Registrarse') }} + + + + + + diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 1bdc796..a7dc571 100755 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,8 +1,12 @@ - - + + + + - - - + @if (!in_array(auth()->user()->rol?->nombre, ['administrador', 'Roger','editor'])) + + @endif + + diff --git a/resources/views/livewire/share-code-component.blade.php b/resources/views/livewire/share-code-component.blade.php new file mode 100644 index 0000000..edc240f --- /dev/null +++ b/resources/views/livewire/share-code-component.blade.php @@ -0,0 +1,107 @@ + + + + + Compartir Código + + Comparte tu código de referido. + + + Tu código: + + + + Copiar + + + + + + + + + + + + + + Mis Referidos + + Aquí puedes ver la lista de tus referidos. + + + + + + + + + {{ $referrals->count() }} + + Total de referidos + + + + + + + + + + Fecha + + + Usuario + + + Referidos del usuario + + + Estado + + + + + @forelse ($referrals as $item) + + {{ $item->created_at->format('Y-m-d') }} + {{ $item->email }} + {{ $item->children_count }} + + + Inactivo + + + + @empty + + + No tienes referidos aún. + + + @endforelse + + + + + + + + + diff --git a/resources/views/livewire/show-promociones.blade.php b/resources/views/livewire/show-promociones.blade.php index 3c199c0..08f4d95 100755 --- a/resources/views/livewire/show-promociones.blade.php +++ b/resources/views/livewire/show-promociones.blade.php @@ -24,7 +24,7 @@ - + Promociones @if (auth()->user()->rol->nombre == 'super' || auth()->user()->rol->nombre == 'administrador') @@ -66,67 +66,32 @@ --}} - - - Seleccione una categoria: + + + @foreach ($categorias as $i => $categoria1) + + + + @endforeach + - - - - @foreach ($categorias as $categoria1) - - - - - - - @endforeach - - - - - - - - - - - - - - Ver - todos + + + Ver todas las promociones + @if ($categorian) - - - Seleccione una promocion: - - - + + @foreach ($categorias->where('nombre', $categorian)->first()->promociones as $promocion) @if ($promocion->visible == 'true') @if (empty(($usuario = $promocion->usuario_promos->where('usuario_id', Auth::user()->id)->first()))) - + x-transition:leave-end="opacity-0 scale-100" class="fixed inset-0 z-50 backdrop-blur-sm bg-black/20"> @@ -291,11 +255,10 @@ - Valor de compra: - + Valor de + compra: + @@ -327,8 +290,7 @@ class="w-10 h-10 float-right bg-[#B221FD] hover:bg-[#7a02b8] rounded-full active:shadow-lg mouse shadow ease-in focus:outline-none"> - @@ -345,21 +307,20 @@ Tarifas @foreach ($tarifas as $tarifa) - @if($tarifa->servicio?->estado == 'activo') - {{ $tarifa->servicio->nombre ?? '' }} - : - @if (!empty($tarifa->servicio->por_tiempo)) - {{ $tarifa->dias ?? '' }} - {{ $tarifa->dias == 1 ? 'día' : 'días' }} - @else - {{ $tarifa->pantallas ?? '' }} - {{ $tarifa->pantallas == 1 ? 'pantalla' : 'pantallas' }} - - {{ $tarifa->dias ?? '' }} - {{ $tarifa->dias == 1 ? 'día' : 'días' }} - + @if ($tarifa->servicio?->estado == 'activo') + {{ $tarifa->servicio->nombre ?? '' }} + : + @if (!empty($tarifa->servicio->por_tiempo)) + {{ $tarifa->dias ?? '' }} + {{ $tarifa->dias == 1 ? 'día' : 'días' }} + @else + {{ $tarifa->pantallas ?? '' }} + {{ $tarifa->pantallas == 1 ? 'pantalla' : 'pantallas' }} - + {{ $tarifa->dias ?? '' }} + {{ $tarifa->dias == 1 ? 'día' : 'días' }} + @endif + @endif - - @endif @endforeach @@ -523,7 +484,9 @@ - Comprar + Comprar - @@ -818,73 +780,82 @@ - - El valor de ${{ number_format($total = (int) $precioAhora * (int) $cantidad_comprarPromo) }} será descontado de su saldo. - + + El valor de + ${{ number_format($total = (int) $precioAhora * (int) $cantidad_comprarPromo) }} será + descontado de su saldo. + - - - + + + @if ($total > auth()->user()->saldo->valor) - + No tiene fondo suficientes para esta compra, recargue su cuenta. @if (auth()->user()->rol->nombre != 'editor' && auth()->user()->rol->nombre != 'administrador') - Recargar + Recargar @endif @endif - + - user()->saldo->valor) - class="inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 sm:mb-[0] mb-2 text-white bg-[#B221FD] hover:bg-[#7a02b8] focus:shadow-outline-green sm-text-sm sm-leading-5" - @else - disabled - class="cursor-no-drop inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 sm:mb-[0] mb-2 text-white bg-gray-200 hover:bg-gray-200 focus:shadow-outline-green sm-text-sm sm-leading-5" - @endif - onclick="enviarInfoCompra()"> + user()->saldo->valor) class="inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 sm:mb-[0] mb-2 text-white bg-[#B221FD] hover:bg-[#7a02b8] focus:shadow-outline-green sm-text-sm sm-leading-5" + @else + disabled + class="cursor-no-drop inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 sm:mb-[0] mb-2 text-white bg-gray-200 hover:bg-gray-200 focus:shadow-outline-green sm-text-sm sm-leading-5" @endif + onclick="enviarInfoCompra()"> Comprar - + + class="inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 text-white bg-[#585858] hover:bg-[#3a3a3a] focus:shadow-outline-green sm-text-sm sm-leading-5"> Cerrar - + Procesando... por favor espera. - + - + - + @@ -1053,7 +1026,6 @@ @if (!empty($cuenta->servicio->ver_url)) *URL:* {{ $cuenta->servicio->url }} @else - *Servicio:* {{ $cuenta->servicio->nombre }} @foreach ($cuenta->perfil as $perfil) @if ($cuentas->id == $perfil->historial_id && $cuenta->estado == 'activo') - Perfil {{ $perfil->perfil }} @if (!empty($cuenta->servicio->perfiles)) @@ -1119,12 +1091,9 @@ - - + - Cerrar + Cerrar @@ -1165,38 +1134,50 @@ - - + + diff --git a/resources/views/livewire/show-usuarios.blade.php b/resources/views/livewire/show-usuarios.blade.php index f0306fb..a0e757c 100755 --- a/resources/views/livewire/show-usuarios.blade.php +++ b/resources/views/livewire/show-usuarios.blade.php @@ -488,10 +488,10 @@ - Selecciona rol: - Selecciona rol: + - Rol + Rol @foreach ($roles as $rol) {{ $rol->nombre }} @endforeach
+ Comparte tu código de referido. +
+ Aquí puedes ver la lista de tus referidos. +
No tiene fondo suficientes para esta compra, recargue su cuenta.