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 - +
{{-- --}} - - +
- +
{{-- --}} -
+
- +
- +
{{ __('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 - - -
- - - - - +
+ - -
- +
+ + @csrf - + +
+ {{-- --}} - -
+ - -
- + +
- + +
+ {{-- --}} - -
+ - -
- + +
- + +
+ {{-- --}} - -
+ - - - {{ __('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: +
+ + +
+ +
+
+
+
+
+ +
+
+
+
+

Mis Referidos

+

+ Aquí puedes ver la lista de tus referidos. +

+
+
+ + + + + + {{ $referrals->count() }} + + Total de referidos +
+
+ +
+
+ + + + + + + + + + + @forelse ($referrals as $item) + + + + + + + @empty + + + + @endforelse + +
+ Fecha + + Usuario + + Referidos del usuario + + Estado +
{{ $item->created_at->format('Y-m-d') }}{{ $item->email }}{{ $item->children_count }} + + Inactivo + +
+ No tienes referidos aún. +
+
+
+
+
+ + + 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) +
+ imagen de {{ $categoria1->nombre }} +
+ @endforeach
+
-
-
- - @foreach ($categorias as $categoria1) - - @endforeach -
-
- imagen de {{ $categoria1->nombre }} - -
-
-
- - -
- +
+
@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 @@
- - + +
@@ -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 @@ @foreach ($tarifas as $tarifa) - @if($tarifa->servicio?->estado == 'activo') - @endif - - @endif @endforeach @@ -523,7 +484,9 @@
- +
-
- 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') - + @endif
@endif
-
+
- - + - + - +
- + - +
@@ -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 @@
-
- +
- +
@@ -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 @@
- - - + @foreach ($roles as $rol) @endforeach