diff --git a/app/Http/Controllers/ProspectoController.php b/app/Http/Controllers/AlumnoController.php similarity index 55% rename from app/Http/Controllers/ProspectoController.php rename to app/Http/Controllers/AlumnoController.php index 794bf52f..16f8a143 100644 --- a/app/Http/Controllers/ProspectoController.php +++ b/app/Http/Controllers/AlumnoController.php @@ -3,19 +3,19 @@ namespace App\Http\Controllers; use App\Models\User; -use App\Models\Prospecto; +use App\Models\Alumno; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Auth; -class ProspectoController extends Controller +class AlumnoController extends Controller { public function __construct() { - $this->middleware('can:prospecto.index')->only('index','show'); - $this->middleware('can:prospecto.create')->only('create','store'); - $this->middleware('can:prospecto.edit')->only('edit','update'); - $this->middleware('can:prospecto.destroy')->only('destroy'); + $this->middleware('can:alumno.index')->only('index','show'); + $this->middleware('can:alumno.create')->only('create','store'); + $this->middleware('can:alumno.edit')->only('edit','update'); + $this->middleware('can:alumno.destroy')->only('destroy'); } public function index() @@ -23,24 +23,24 @@ class ProspectoController extends Controller $user = Auth::user(); $plantelesUsuario = $user->plantelUsuarios->pluck('id'); - $prospectos = User::with(['prospectos' => function ($query) use ($user, $plantelesUsuario) { + $alumnos = User::with(['alumnos' => function ($query) use ($user, $plantelesUsuario) { $query->where(function ($q) use ($user, $plantelesUsuario) { $q->where('usuario_registro', $user->id) - ->orWhereHas('prospectos.plantelUsuarios', function ($sub) use ($plantelesUsuario) { + ->orWhereHas('alumnos.plantelUsuarios', function ($sub) use ($plantelesUsuario) { $sub->whereIn('plantels.id', $plantelesUsuario); }); }); }]) - ->whereHas('prospectos', function ($query) use ($user, $plantelesUsuario) { + ->whereHas('alumnos', function ($query) use ($user, $plantelesUsuario) { $query->where(function ($q) use ($user, $plantelesUsuario) { $q->where('usuario_registro', $user->id) - ->orWhereHas('prospectos.plantelUsuarios', function ($sub) use ($plantelesUsuario) { + ->orWhereHas('alumnos.plantelUsuarios', function ($sub) use ($plantelesUsuario) { $sub->whereIn('plantels.id', $plantelesUsuario); }); @@ -49,29 +49,29 @@ class ProspectoController extends Controller }) ->get(); - return view('prospecto.index', compact('prospectos')); + return view('alumno.index', compact('alumnos')); } - public function destroy(Prospecto $prospecto) + public function destroy(Alumno $alumno) { - $user = $prospecto->prospectos()->first(); + $user = $alumno->alumnos()->first(); if ($user) { $user->roles()->detach(); $user->plantelUsuarios()->detach(); - $prospecto->prospectos()->detach($user->id); + $alumno->alumnos()->detach($user->id); $user->delete(); } - $prospecto->delete(); + $alumno->delete(); session()->flash('swal',[ 'icon'=>'success', 'title'=>'Eliminado!', 'text'=>'Se ha eliminado el registro correctamente' ]); - return redirect()->route('prospecto.index'); + return redirect()->route('alumno.index'); } } diff --git a/app/Http/Controllers/StripeWebhookController.php b/app/Http/Controllers/StripeWebhookController.php index 066c9b36..6934c869 100644 --- a/app/Http/Controllers/StripeWebhookController.php +++ b/app/Http/Controllers/StripeWebhookController.php @@ -4,41 +4,44 @@ namespace App\Http\Controllers; use App\Models\Pago; use Illuminate\Http\Request; -use Stripe\Webhook; use Stripe\Exception\SignatureVerificationException; +use Stripe\Webhook; class StripeWebhookController extends Controller { public function handle(Request $request) { $payload = $request->getContent(); - $signature = $request->header('Stripe-Signature'); + $sigHeader = $request->header('Stripe-Signature'); $secret = config('services.stripe.webhook_secret'); try { $event = Webhook::constructEvent( $payload, - $signature, + $sigHeader, $secret ); } catch (SignatureVerificationException $e) { - return response('Firma inv谩lida', 400); + return response()->json(['error' => 'Webhook inv谩lido'], 400); } - // 馃憠 Evento que nos importa - if ($event->type === 'checkout.session.completed') { + switch ($event->type) { - $session = $event->data->object; + case 'checkout.session.completed': - $pagoId = $session->metadata->pago_id ?? null; + $session = $event->data->object; - if ($pagoId) { - Pago::where('id', $pagoId)->update([ - 'estado' => 'pagado', - ]); - } + Pago::where('id',$session->id)->update(['estado'=>'pagado']); + + break; + + case 'payment_intent.payment_failed': + + // manejar fallo de pago + + break; } - return response('OK', 200); + return response()->json(['status' => 'ok']); } } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index f54e4959..57c1ce8c 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -89,6 +89,7 @@ class UserController extends Controller public function destroy(User $user) { $user->plantelUsuarios()->detach(); + $user->roles()->detach(); $user->delete(); session()->flash('swal',[ 'icon'=>'success', diff --git a/app/Livewire/CarruselInicio.php b/app/Livewire/CarruselInicio.php new file mode 100644 index 00000000..f99d7a0d --- /dev/null +++ b/app/Livewire/CarruselInicio.php @@ -0,0 +1,13 @@ +prospecto->prospectos()->first(); + $user = $this->prospecto->alumnos()->first(); if (!$user) return; try { $this->validate([ 'pname' => 'required', + 'papellidoPaterno' => 'required', + 'papellidoMaterno' => 'required', 'pemail' => [ 'required', @@ -143,6 +147,8 @@ class DataProspecto extends Component ], [ 'pname.required' => 'El nombre es obligatorio', + 'papellidoPaterno.required' => 'El apellido paterno es obligatorio', + 'papellidoMaterno.required' => 'El apellido materno es obligatorio', 'pemail.required' => 'El correo es obligatorio', 'pemail.email' => 'El correo no es v谩lido', 'pemail.unique' => 'Este correo ya est谩 registrado', @@ -171,7 +177,9 @@ class DataProspecto extends Component } $user->update([ - 'name' => $this->pname, + 'name' => mb_strtoupper($this->pname, 'UTF-8'), + 'apellidoPaterno' => mb_strtoupper($this->papellidoPaterno, 'UTF-8'), + 'apellidoMaterno' => mb_strtoupper($this->papellidoMaterno, 'UTF-8'), 'email' => $this->pemail, 'telefono' => $this->ptelefono, 'direccion' => $this->pdireccion, @@ -205,11 +213,13 @@ class DataProspecto extends Component $this->resetForm(); - $this->prospecto = Prospecto::findOrFail($id); - $user = $this->prospecto->prospectos()->first(); + $this->prospecto = Alumno::findOrFail($id); + $user = $this->prospecto->alumnos()->first(); if (!$user) return; $this->pname = $user->name; + $this->papellidoPaterno = $user->apellidoPaterno; + $this->papellidoMaterno = $user->apellidoPaterno; $this->pemail = $user->email; $this->ptelefono = $user->telefono; $this->pdireccion = $user->direccion; @@ -260,7 +270,6 @@ class DataProspecto extends Component public function plan() { - if($this->prospecto->plane_id != $this->selectedplane){ Pago::where('user_id', '=', $this->prospecto->id)->delete(); @@ -313,6 +322,9 @@ class DataProspecto extends Component { // Usuario $this->pname = null; + $this->papellidoPaterno = null; + $this->papellidoMaterno = null; + $this->pname = null; $this->pemail = null; $this->ptelefono = null; $this->pdireccion = null; diff --git a/app/Livewire/ModalProspecto.php b/app/Livewire/ModalProspecto.php index 6f43b03a..b41ff084 100644 --- a/app/Livewire/ModalProspecto.php +++ b/app/Livewire/ModalProspecto.php @@ -2,28 +2,32 @@ namespace App\Livewire; +use App\Models\Alumno; use App\Models\Campan; use App\Models\Medio; -use App\Models\User; use App\Models\Nivel; use App\Models\Plan; use App\Models\Plantel; -use App\Models\Prospecto; use App\Models\Turno; -use Livewire\Component; -use Spatie\Permission\Models\Role; +use App\Models\User; +use Illuminate\Auth\Notifications\ResetPassword; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Password; +use Illuminate\Support\Str; use Livewire\Attributes\On; +use Livewire\Component; +use Spatie\Permission\Models\Role; class ModalProspecto extends Component { // Usuario public $pname; + public $papellidoPaterno; + public $papellidoMaterno; public $pemail; public $ptelefono; public $pdireccion; - public $ppassword; public $pplantels; public $proles; @@ -48,10 +52,11 @@ class ModalProspecto extends Component { $this->reset([ 'pname', + 'papellidoPaterno', + 'papellidoMaterno', 'pemail', 'ptelefono', 'pdireccion', - 'ppassword', 'pplantels', 'proles', 'selectedNivel', @@ -108,7 +113,6 @@ class ModalProspecto extends Component $this->active = ""; } - /* ------------------ GUARDAR ------------------ */ public function guardarProspecto() { if (User::where('email', $this->pemail) @@ -124,24 +128,29 @@ class ModalProspecto extends Component closeModal: true ); - - return; } + $passwordTemporal = Str::random(12); + $user = User::create([ - 'name' => $this->pname, + 'name' => mb_strtoupper($this->pname, 'UTF-8'), + 'apellidoPaterno' => mb_strtoupper($this->papellidoPaterno, 'UTF-8'), + 'apellidoMaterno' => mb_strtoupper($this->papellidoMaterno, 'UTF-8'), 'email' => $this->pemail, 'telefono' => $this->ptelefono, 'direccion' => $this->pdireccion, - 'password' => Hash::make($this->ppassword), + 'password' => Hash::make($passwordTemporal), 'status' => 1 ]); $user->roles()->sync($this->proles); $user->plantelUsuarios()->sync([$this->pplantels]); - $prospecto = Prospecto::create([ + $token = Password::createToken($user); + $user->notify(new ResetPassword($token)); + + $prospecto = Alumno::create([ 'nivel' => $this->selectedNivel, 'plan_id' => $this->selectedplan, 'usuario_registro' => Auth::id(), @@ -150,7 +159,7 @@ class ModalProspecto extends Component 'medio' => $this->pmedio, ]); - $prospecto->prospectos()->sync([$user->id]); + $prospecto->alumnos()->sync([$user->id]); $this->dispatch('swal', icon: 'success', @@ -165,8 +174,6 @@ class ModalProspecto extends Component $this->resetForm(); } - - /* ------------------ RENDER ------------------ */ public function render() { return view('livewire.modal-prospecto', [ diff --git a/app/Models/Alumno.php b/app/Models/Alumno.php new file mode 100644 index 00000000..07bfd13b --- /dev/null +++ b/app/Models/Alumno.php @@ -0,0 +1,29 @@ +belongsToMany(Plantel::class); + } + + public function existe($plantelId): bool + { + return $this->plantelUsuarios() + ->where('plantels.id', $plantelId) + ->exists(); + } + + public function alumnos() : BelongsToMany + { + return $this->belongsToMany(User::class); + } + +} diff --git a/app/Models/Prospecto.php b/app/Models/Prospecto.php deleted file mode 100644 index a199ba6a..00000000 --- a/app/Models/Prospecto.php +++ /dev/null @@ -1,31 +0,0 @@ -belongsToMany(Plantel::class); -} - -public function existe($plantelId): bool -{ - return $this->plantelUsuarios() - ->where('plantels.id', $plantelId) - ->exists(); -} - - public function prospectos() : BelongsToMany - { - return $this->belongsToMany(User::class); - } - -} diff --git a/app/Models/User.php b/app/Models/User.php index e0248de6..6ff10307 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -125,9 +125,9 @@ class User extends Authenticatable } - public function prospectos() : BelongsToMany + public function alumnos() : BelongsToMany { - return $this->belongsToMany(Prospecto::class); + return $this->belongsToMany(Alumno::class); } protected static function booted() diff --git a/app/Notifications/UserPassword.php b/app/Notifications/UserPassword.php new file mode 100644 index 00000000..578efd45 --- /dev/null +++ b/app/Notifications/UserPassword.php @@ -0,0 +1,34 @@ +token = $token; + } + + public function via($notifiable) + { + return ['mail']; + } + + public function toMail($notifiable) + { + $url = url(route('password.reset', [ + 'token' => $this->token, + 'email' => $notifiable->email, + ], false)); + + return (new MailMessage) + ->subject('Configura tu contrase帽a') + ->greeting('Hola '.$notifiable->name) + ->line('Se ha creado una cuenta para ti en el sistema.') + ->line('Para acceder debes definir tu contrase帽a.') + ->action('Definir contrase帽a', $url) + ->line('Si no solicitaste esta cuenta puedes ignorar este correo.'); + } +} diff --git a/database/migrations/2025_12_31_022844_create_prospectos_table.php b/database/migrations/2025_12_31_022844_create_alumnos_table.php similarity index 88% rename from database/migrations/2025_12_31_022844_create_prospectos_table.php rename to database/migrations/2025_12_31_022844_create_alumnos_table.php index 3dc44eae..5c11b037 100644 --- a/database/migrations/2025_12_31_022844_create_prospectos_table.php +++ b/database/migrations/2025_12_31_022844_create_alumnos_table.php @@ -9,7 +9,7 @@ return new class extends Migration public function up(): void { - Schema::create('prospectos', function (Blueprint $table) { + Schema::create('alumnos', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('nivel'); $table->unsignedBigInteger('plan_id'); @@ -28,6 +28,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('prospectos'); + Schema::dropIfExists('alumnos'); } }; diff --git a/database/migrations/2025_12_31_043358_create_prospecto_user_table.php b/database/migrations/2025_12_31_043358_create_alumno_user_table.php similarity index 60% rename from database/migrations/2025_12_31_043358_create_prospecto_user_table.php rename to database/migrations/2025_12_31_043358_create_alumno_user_table.php index 0e146dee..7b490466 100644 --- a/database/migrations/2025_12_31_043358_create_prospecto_user_table.php +++ b/database/migrations/2025_12_31_043358_create_alumno_user_table.php @@ -9,9 +9,9 @@ return new class extends Migration public function up(): void { - Schema::create('prospecto_user', function (Blueprint $table) { - $table->unsignedBigInteger('prospecto_id'); - $table->foreign('prospecto_id')->references('id')->on('prospectos'); + Schema::create('alumno_user', function (Blueprint $table) { + $table->unsignedBigInteger('alumno_id'); + $table->foreign('alumno_id')->references('id')->on('alumnos'); $table->unsignedBigInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); }); @@ -19,6 +19,6 @@ return new class extends Migration public function down(): void { - Schema::dropIfExists('prospecto_user'); + Schema::dropIfExists('alumno_user'); } }; diff --git a/database/migrations/2026_01_03_173803_create_prospecto_status_table.php b/database/migrations/2026_01_03_173803_create_alumno_status_table.php similarity index 77% rename from database/migrations/2026_01_03_173803_create_prospecto_status_table.php rename to database/migrations/2026_01_03_173803_create_alumno_status_table.php index b383222c..3db02103 100644 --- a/database/migrations/2026_01_03_173803_create_prospecto_status_table.php +++ b/database/migrations/2026_01_03_173803_create_alumno_status_table.php @@ -11,7 +11,7 @@ return new class extends Migration */ public function up(): void { - Schema::create('prospecto_status', function (Blueprint $table) { + Schema::create('alumno_status', function (Blueprint $table) { $table->id(); $table->string('name'); }); @@ -22,6 +22,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('prospecto_status'); + Schema::dropIfExists('alumno_status'); } }; diff --git a/database/seeders/prospectoStatusSeeder.php b/database/seeders/AlumnoStatusSeeder.php similarity index 58% rename from database/seeders/prospectoStatusSeeder.php rename to database/seeders/AlumnoStatusSeeder.php index 7852484d..8c1a4a36 100644 --- a/database/seeders/prospectoStatusSeeder.php +++ b/database/seeders/AlumnoStatusSeeder.php @@ -5,24 +5,24 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; -class prospectoStatusSeeder extends Seeder +class AlumnoStatusSeeder extends Seeder { public function run(): void { - DB::table('prospecto_status')->insert([ + DB::table('alumno_status')->insert([ 'name' => 'activo' ]); - DB::table('prospecto_status')->insert([ + DB::table('alumno_status')->insert([ 'name' => 'aspirante' ]); - DB::table('prospecto_status')->insert([ + DB::table('alumno_status')->insert([ 'name' => 'inscrito' ]); - DB::table('prospecto_status')->insert([ + DB::table('alumno_status')->insert([ 'name' => 'baja' ]); } diff --git a/database/seeders/ConceptoSeeder.php b/database/seeders/ConceptoSeeder.php index 0016440e..7d58e842 100644 --- a/database/seeders/ConceptoSeeder.php +++ b/database/seeders/ConceptoSeeder.php @@ -74,7 +74,7 @@ class ConceptoSeeder extends Seeder $concepto=Concepto::create([ 'name' => 2, 'fecha_pago' => $year.'-'.$i.'-01', - 'monto' => '2000', + 'monto' => '20', 'tipo' => $tipo, 'recargo' => $recargo ]); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 69b3bcfd..c1ac75e0 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -18,7 +18,7 @@ class DatabaseSeeder extends Seeder $this->call(DurationSeeder::class); $this->call(CarreraSeeder::class); $this->call(AreaSeeder::class); - $this->call(prospectoStatusSeeder::class); + $this->call(AlumnoStatusSeeder::class); $this->call(TurnoSeeder::class); $this->call(MedioSeeder::class); $this->call(CampanSeeder::class); diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php index f7063e0b..b43a5270 100644 --- a/database/seeders/RoleSeeder.php +++ b/database/seeders/RoleSeeder.php @@ -16,7 +16,7 @@ class RoleSeeder extends Seeder $role1 = Role::create(['name'=>'Admin']); $role2 = Role::create(['name'=>'Blogger']); $role3 = Role::create(['name'=>'Promotor']); - $role4 = Role::create(['name'=>'Prospecto']); + $role4 = Role::create(['name'=>'alumno']); Permission::create(['name'=>'note.index','description'=>'Ver notas'])->syncRoles([$role2]); Permission::create(['name'=>'note.create','description'=>'Crear notas'])->syncRoles([$role2]); @@ -68,10 +68,10 @@ class RoleSeeder extends Seeder Permission::create(['name'=>'plan.edit','description'=>'Editar planes'])->syncRoles([$role1]); Permission::create(['name'=>'plan.destroy','description'=>'Eliminar planes'])->syncRoles([$role1]); - Permission::create(['name'=>'prospecto.index','description'=>'Ver prospectos'])->syncRoles([$role1,$role3]); - Permission::create(['name'=>'prospecto.create','description'=>'Crear prospectos'])->syncRoles([$role1,$role3]); - Permission::create(['name'=>'prospecto.edit','description'=>'Editar prospectos'])->syncRoles([$role1,$role3]); - Permission::create(['name'=>'prospecto.destroy','description'=>'Eliminar prospectos'])->syncRoles([$role1,$role3]); + Permission::create(['name'=>'alumno.index','description'=>'Ver alumnos'])->syncRoles([$role1,$role3]); + Permission::create(['name'=>'alumno.create','description'=>'Crear alumnos'])->syncRoles([$role1,$role3]); + Permission::create(['name'=>'alumno.edit','description'=>'Editar alumnos'])->syncRoles([$role1,$role3]); + Permission::create(['name'=>'alumno.destroy','description'=>'Eliminar alumnos'])->syncRoles([$role1,$role3]); Permission::create(['name'=>'area.index','description'=>'Ver areas'])->syncRoles([$role1]); Permission::create(['name'=>'area.create','description'=>'Crear areas'])->syncRoles([$role1]); diff --git a/public/assets/css/style.css b/public/assets/css/style.css index 18cf8834..4f2a1b73 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -333,3 +333,56 @@ button:hover { min-height:18px; padding-left:5px; } + + +/* carrusel */ +/* altura del carrusel */ +.carousel, +.carousel-inner, +.carousel-item { +height: 100%; +} + +/* im谩genes */ +.carousel-item img{ +height:100%; +width:100%; +object-fit:cover; +} + +/* zoom suave tipo landing page */ +.carousel-item img{ +transform: scale(1); +transition: transform 8s ease; +} + +.carousel-item.active img{ +transform: scale(1.08); +} + +/* overlay oscuro elegante */ +.carousel-item::after{ +content:""; +position:absolute; +inset:0; +background:rgba(0,0,0,0.35); +} + +/* texto encima del carrusel */ +.carousel-caption{ +bottom:40px; +animation: fadeUp 1s ease; +} + +@keyframes fadeUp{ +from{ +opacity:0; +transform:translateY(20px); +} +to{ +opacity:1; +transform:translateY(0); +} +} + +/* carrusel */ diff --git a/resources/views/prospecto/index.blade.php b/resources/views/alumno/index.blade.php similarity index 78% rename from resources/views/prospecto/index.blade.php rename to resources/views/alumno/index.blade.php index 6369495c..78e6169c 100644 --- a/resources/views/prospecto/index.blade.php +++ b/resources/views/alumno/index.blade.php @@ -11,26 +11,24 @@
+
+Gesti贸n escolar moderna
+
+
+Acceso seguro para estudiantes
+
+
+Transformando la educaci贸n digital
+
+
+Mejorando procesos internos
+
+
+Transformando la educaci贸n digital
+| Id | -Nombre | -Opciones | -
|---|---|---|
| {{$material->id}} | -{{$material->name}} | -
- @can('material.edit')
-
- @endcan
-
- @can('material.destroy')
-
-
- @endcan
-
- |
-
+