Modificacion de prospecto a alumno y asignacion de grupos, coordinacion académica

This commit is contained in:
2026-03-23 15:48:23 -06:00
parent 58e27fc5fc
commit 1bcebeb8a1
43 changed files with 1551 additions and 96 deletions
+3 -2
View File
@@ -2,6 +2,7 @@
namespace App\Actions\Fortify;
use App\Models\Alumno;
use App\Models\Prospecto;
use App\Models\User;
use Illuminate\Auth\Notifications\ResetPassword;
@@ -52,7 +53,7 @@ class CreateNewUser implements CreatesNewUsers
$user->roles()->sync([4]);
$user->plantelUsuarios()->sync($input['plantels']);
$prospecto = Prospecto::create([
$prospecto = Alumno::create([
'nivel' => 0,
'plan_id' => 0,
'usuario_registro' => 0,
@@ -61,7 +62,7 @@ class CreateNewUser implements CreatesNewUsers
'medio' => 0,
]);
$prospecto->prospectos()->sync([$user->id]);
$prospecto->alumnos()->sync([$user->id]);
$token = Password::createToken($user);
$user->notify(new ResetPassword($token));
+33 -5
View File
@@ -2,9 +2,9 @@
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Alumno;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
@@ -21,23 +21,26 @@ class AlumnoController extends Controller
public function index()
{
$user = Auth::user();
if ($user->hasRole('Promotor')) {
$plantelesUsuario = $user->plantelUsuarios->pluck('id');
$alumnos = User::with(['alumnos' => function ($query) use ($user, $plantelesUsuario) {
$query->where(function ($q) use ($user, $plantelesUsuario) {
$query->where('status', 1)
->where(function ($q) use ($user, $plantelesUsuario) {
$q->where('usuario_registro', $user->id)
->orWhereHas('alumnos.plantelUsuarios', function ($sub) use ($plantelesUsuario) {
$sub->whereIn('plantels.id', $plantelesUsuario);
});
});
}])
->whereHas('alumnos', function ($query) use ($user, $plantelesUsuario) {
$query->where(function ($q) use ($user, $plantelesUsuario) {
$query->where('status', 1)
->where(function ($q) use ($user, $plantelesUsuario) {
$q->where('usuario_registro', $user->id)
->orWhereHas('alumnos.plantelUsuarios', function ($sub) use ($plantelesUsuario) {
@@ -48,10 +51,35 @@ class AlumnoController extends Controller
})
->get();
}
if ($user->hasRole('Control escolar')) {
$plantelesUsuario = $user->plantelUsuarios->pluck('id');
$alumnos = Alumno::with(['alumnos.plantelUsuarios','statusAlumno'])
->where('status','!=',1)
->whereHas('alumnos.plantelUsuarios', function ($q) use ($plantelesUsuario) {
$q->whereIn('plantels.id', $plantelesUsuario);
})
->get();
}
return view('alumno.index', compact('alumnos'));
}
public function edit(Alumno $alumno)
{
return view('alumno.edit',compact('alumno'));
}
public function update(Request $request, Alumno $alumno)
{
$alumno->update($request->all());
return redirect()->route('alumno.edit',$alumno)->with('info','El alumno se actualizo correctamente');
}
public function destroy(Alumno $alumno)
{
$user = $alumno->alumnos()->first();
@@ -0,0 +1,64 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DocenteController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
+154
View File
@@ -0,0 +1,154 @@
<?php
namespace App\Http\Controllers;
use App\Models\Alumno;
use App\Models\Grupo;
use App\Models\Plan;
use App\Models\Plane;
use App\Models\Plantel;
use App\Models\Turno;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
class GrupoController extends Controller
{
public function __construct() {
$this->middleware('can:grupo.index')->only('index','show');
$this->middleware('can:grupo.create')->only('create','store');
$this->middleware('can:grupo.edit')->only('edit','update');
$this->middleware('can:grupo.destroy')->only('destroy');
}
public function index()
{
$user = Auth::user();
if ($user->hasRole('Admin')) {
$grupos = Grupo::all();
}
if ($user->hasRole(['Control escolar','Coordinación académica'])) {
$plantelesIds = $user->plantelUsuarios->pluck('id');
$grupos = Grupo::with('plan')
->whereHas('plan.planesPlantel', function ($query) use ($plantelesIds) {
$query->whereIn('plantel_id', $plantelesIds);
})
->get();
}
return view('grupo.index', compact('grupos'));
}
public function create()
{
$turnos= Turno::all();
$user = Auth::user();
$plantels = $user->plantelUsuarios->pluck('id');
$planteles = $user->plantelUsuarios;
$plans = Plan::with(['carreraRel', 'nivelRel'])
->whereHas('planesPlantel', function ($query) use ($plantels) {
$query->whereIn('plantel_id', $plantels);
})
->get()
->groupBy(function ($plan) {
return $plan->nivelRel->name;
});
return view('grupo.create',compact(['turnos','plans','planteles']));
}
public function store(Request $request)
{
$nivel = Plan::where('id',$request->plan_id)->first();
$grupo = Grupo::create([
'plan_id' => $request->plan_id,
'ciclo' => 1,
'nivel' => $nivel->nivel,
'plantel' => $request->plantel,
'turno' => $request->turno,
'status'=>1
]);
return redirect()->route('grupo.edit',$grupo)->with('info','El grupo se creo correctamente');
}
public function show(Plane $plane)
{
return view('grupo.show',compact('plane'));
}
public function edit(Grupo $grupo)
{
$turnos= Turno::all();
$user = Auth::user();
$plantels = $user->plantelUsuarios->pluck('id');
$planteles = $user->plantelUsuarios;
$plans = Plan::with(['carreraRel', 'nivelRel'])
->whereHas('planesPlantel', function ($query) use ($plantels) {
$query->whereIn('plantel_id', $plantels);
})
->get()
->groupBy(function ($plan) {
return $plan->nivelRel->name;
});
$ciclos = Plan::where('id',$grupo->plan_id)->first();
return view('grupo.edit',compact(['grupo','turnos','plans','planteles','ciclos']));
}
public function update(Request $request,Grupo $grupo)
{
$nivel = Plan::where('id',$request->plan_id)->first();
$grupo = Grupo::update([
'plan_id' => $request->plan_id,
'ciclo' => 1,
'nivel' => $nivel->nivel,
'plantel' => $request->plantel,
'turno' => $request->turno,
'status'=>1
]);
return redirect()->route('grupo.edit',$grupo)->with('info','El grupo se actualizo correctamente');
}
public function destroy(Grupo $grupo,Request $request)
{
if($request->alumno){
$alumno= Alumno::find($request->alumno);
$alumno->grupos()->detach();
session()->flash('swal',[
'icon'=>'success',
'title'=>'Eliminado!',
'text'=>'Se ha eliminado el registro correctamente'
]);
return redirect()->route('grupo.edit',$grupo);
}else{
$grupo->alumnos()->detach();
$grupo->delete();
session()->flash('swal',[
'icon'=>'success',
'title'=>'Eliminado!',
'text'=>'Se ha eliminado el registro correctamente'
]);
return redirect()->route('grupo.index');
}
}
}
@@ -0,0 +1,64 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class MateriaController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
@@ -8,8 +8,6 @@ use Illuminate\Http\Request;
class MaterialController extends Controller
{
public function store(Request $request)
{
$material =Material::create($request->except(['carrera']));
-1
View File
@@ -24,7 +24,6 @@ class PlaneController extends Controller
return view('plane.index',compact('planes'));
}
public function create()
{
$plantels=Plantel::where('status','=','1')->get();
+4 -1
View File
@@ -360,7 +360,10 @@ class DataProspecto extends Component
'roles' => Role::whereHas('areas', fn($q) => $q->where('areas.name', 'Promoción'))->get(),
'plantels'=> Plantel::all(),
'user' => Auth::user(),
'campans' => Campan::all(),
'campans' => Campan::whereDate('periodoInicial', '<=', now())
->whereDate('periodoFinal', '>=', now())
->where('status', 1)
->get(),
'medios' => Medio::all(),
]);
}
+92
View File
@@ -0,0 +1,92 @@
<?php
namespace App\Livewire;
use App\Models\Alumno;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\On;
use Livewire\Component;
class GrupoAlumno extends Component
{
public $grupo = null;
public $selectedAlumnos = [];
public $carrera;
#[On('create-grupo')]
public function creategrupo()
{
$this->dispatch('open-grupo-modal');
}
public function mount($grupo)
{
$this->grupo = $grupo;
}
public function guardar()
{
if (empty($this->selectedAlumnos)) {
session()->flash('error', 'Selecciona al menos un alumno');
return;
}
$this->grupo->alumnos()->syncWithoutDetaching($this->selectedAlumnos);
$this->reset('selectedAlumnos');
$this->dispatch('swal',
icon: 'success',
title: 'Anexado!',
text: 'Se agrego el alumno correctamente',
timer: 2000,
confirm: false,
closeModal: true,
reload: 2000
);
$this->dispatch('close-modal');
}
public function render()
{
$user = Auth::user();
$grupo = $this->grupo;
$plantelesUsuario = $user->plantelUsuarios->pluck('id');
$alumnos = Alumno::query()
->with(['alumnos.plantelUsuarios', 'statusAlumno', 'plan.carreraRel','nivelRel'])
->where('status', 2)
->where('nivel', $grupo->nivel)
->whereDoesntHave('grupos')
->whereHas('alumnos.plantelUsuarios', function ($q) use ($plantelesUsuario) {
$q->whereIn('plantels.id', $plantelesUsuario);
})
->orderByRaw("
CASE
WHEN plan_id = {$grupo->plan_id} THEN 0
ELSE 1
END
")
->orderByRaw("
CASE
WHEN nivel = {$grupo->nivel} THEN 0
ELSE 1
END"
)
->get();
return view('livewire.grupo-alumno', [
'alumnos' => $alumnos,
]);
}
}
+4 -1
View File
@@ -180,7 +180,10 @@ class ModalProspecto extends Component
'roles' => Role::whereHas('areas', fn($q) => $q->where('areas.name', 'Promoción'))->get(),
'plantels'=> Plantel::all(),
'user' => Auth::user(),
'campans' => Campan::all(),
'campans' => Campan::whereDate('periodoInicial', '<=', now())
->whereDate('periodoFinal', '>=', now())
->where('status', 1)
->get(),
'medios' => Medio::all(),
]);
}
+26 -5
View File
@@ -3,17 +3,13 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Alumno extends Model
{
protected $guarded = [];
public function plantelUsuarios(): BelongsToMany
{
return $this->belongsToMany(Plantel::class);
}
public function existe($plantelId): bool
{
return $this->plantelUsuarios()
@@ -26,4 +22,29 @@ class Alumno extends Model
return $this->belongsToMany(User::class);
}
public function usuario()
{
return $this->belongsToMany(User::class);
}
public function statusAlumno(): BelongsTo
{
return $this->belongsTo(AlumnoStatus::class, 'status');
}
public function grupos(): BelongsToMany
{
return $this->belongsToMany(Grupo::class);
}
public function plan()
{
return $this->belongsTo(Plan::class);
}
public function nivelRel()
{
return $this->belongsTo(Nivel::class, 'nivel');
}
}
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class AlumnoStatus extends Model
{
protected $table = 'alumno_status';
public $timestamps = false;
protected $guarded = [];
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Docente extends Model
{
//
}
+23
View File
@@ -0,0 +1,23 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Grupo extends Model
{
protected $guarded = [];
public $timestamps = false;
public function alumnos(): BelongsToMany
{
return $this->belongsToMany(Alumno::class);
}
public function plan()
{
return $this->belongsTo(Plan::class);
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Materia extends Model
{
//
}
+10
View File
@@ -26,4 +26,14 @@ class Plan extends Model
->exists();
}
public function carreraRel()
{
return $this->belongsTo(Carrera::class, 'carrera');
}
public function nivelRel()
{
return $this->belongsTo(Nivel::class, 'nivel');
}
}
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('grupos', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('plan_id');
$table->unsignedBigInteger('ciclo');
$table->unsignedBigInteger('nivel');
$table->unsignedBigInteger('plantel');
$table->unsignedBigInteger('turno');
$table->boolean('status');
});
}
public function down(): void
{
Schema::dropIfExists('grupos');
}
};
@@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('alumno_grupo', function (Blueprint $table) {
$table->unsignedBigInteger('alumno_id');
$table->foreign('alumno_id')->references('id')->on('alumnos');
$table->unsignedBigInteger('grupo_id');
$table->foreign('grupo_id')->references('id')->on('grupos');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('alumno_grupo');
}
};
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('materias', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('materias');
}
};
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('docentes', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('docentes');
}
};
+14 -6
View File
@@ -11,11 +11,7 @@ class AlumnoStatusSeeder extends Seeder
public function run(): void
{
DB::table('alumno_status')->insert([
'name' => 'activo'
]);
DB::table('alumno_status')->insert([
'name' => 'aspirante'
'name' => 'prospecto'
]);
DB::table('alumno_status')->insert([
@@ -23,7 +19,19 @@ class AlumnoStatusSeeder extends Seeder
]);
DB::table('alumno_status')->insert([
'name' => 'baja'
'name' => 'alumno'
]);
DB::table('alumno_status')->insert([
'name' => 'baja temporal'
]);
DB::table('alumno_status')->insert([
'name' => 'baja definitiva'
]);
DB::table('alumno_status')->insert([
'name' => 'graduado'
]);
}
}
+15
View File
@@ -19,5 +19,20 @@ class CampanSeeder extends Seeder
'periodoFinal'=> '2026-02-28',
'status'=>1
]);
Campan::create([
'name'=>'FEBRERO - MARZO 2026',
'periodoInicial'=> '2026-02-01',
'periodoFinal'=> '2026-03-31',
'status'=>1
]);
Campan::create([
'name'=>'ENERO - ABRIL 2026',
'periodoInicial'=> '2026-01-01',
'periodoFinal'=> '2026-04-30',
'status'=>1
]);
}
}
+3 -3
View File
@@ -49,7 +49,7 @@ class ConceptoSeeder extends Seeder
'recargo' => '0'
]);
$concepto1->planConceptos()->sync([1]);
$concepto1->planConceptos()->sync([1,2]);
$concepto2=Concepto::create([
'name' => '3',
@@ -58,7 +58,7 @@ class ConceptoSeeder extends Seeder
'tipo' => '1',
'recargo' => '0'
]);
$concepto2->planConceptos()->sync([1]);
$concepto2->planConceptos()->sync([1,2]);
$year=2026;
$tipo=1;
@@ -79,7 +79,7 @@ class ConceptoSeeder extends Seeder
'recargo' => $recargo
]);
$concepto->planConceptos()->sync([1]);
$concepto->planConceptos()->sync([1,2]);
}
$year++;
}
+3
View File
@@ -24,6 +24,9 @@ class DatabaseSeeder extends Seeder
$this->call(CampanSeeder::class);
$this->call(TipoConceptoSeeder::class);
$this->call(PlaneSeeder::class);
$this->call(PlanSeeder::class);
$this->call(ConceptoSeeder::class);
$this->call(MaterialSeeder::class);
$this->call(GrupoSeeder::class);
}
}
+48
View File
@@ -0,0 +1,48 @@
<?php
namespace Database\Seeders;
use App\Models\Alumno;
use App\Models\Grupo;
use Illuminate\Database\Seeder;
class GrupoSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$grupo = Grupo::create([
'plan_id'=> 1,
'ciclo'=> 1,
'nivel'=> 1,
'plantel'=> 3,
'turno'=> 1,
'status'=> 1
]);
$grupo->alumnos()->sync([1,2,3,4,5,6,7,8,9,10]);
for ($i=1; $i <=10 ; $i++) {
Alumno::where('id', $i)->update([
'status' => 3
]);
}
$grupo2 = Grupo::create([
'plan_id'=> 2,
'ciclo'=> 1,
'nivel'=> 2,
'plantel'=> 3,
'turno'=> 2,
'status'=> 1
]);
$grupo2->alumnos()->sync([16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]);
for ($i=16; $i <=30 ; $i++) {
Alumno::where('id', $i)->update([
'status' => 3
]);
}
}
}
+83
View File
@@ -0,0 +1,83 @@
<?php
namespace Database\Seeders;
use App\Models\Material;
use Illuminate\Database\Seeder;
class MaterialSeeder extends Seeder
{
public function run(): void
{
for ($f=1; $f <=6; $f++) {
for($e=1 ; $e <=8 ; $e++) {
$fakeWord = fake()->word();
$material='';
if($f==1){
$material= Material::create([
'name'=> $fakeWord,
'objetivo'=>'desarrollo de material del ciclo'.$e,
'creditos'=>10,
'ciclo'=>$f,
'horas'=>5,
'clave'=>$e.'-car',
'serial'=>'car',
'status'=>1
]);
$material->carreraMaterial()->sync([1]);
}else{
$material= Material::create([
'name'=> $fakeWord,
'objetivo'=>'desarrollo de material del ciclo'.$e,
'creditos'=>10,
'ciclo'=>$f,
'horas'=>5,
'clave'=>$e.'-car',
'serial'=>'car',
'status'=>0
]);
$material->carreraMaterial()->sync([1]);
}
}
}
for ($f=1; $f <=10; $f++) {
for($e=1 ; $e <=8 ; $e++) {
$fakeWord = fake()->word();
$material2='';
if($f==1){
$material2= Material::create([
'name'=> $fakeWord,
'objetivo'=>'desarrollo de material del ciclo'.$e,
'creditos'=>10,
'ciclo'=>$f,
'horas'=>5,
'clave'=>$e.'-car',
'serial'=>'car',
'status'=>1
]);
$material2->carreraMaterial()->sync([13]);
}else{
$material2= Material::create([
'name'=> $fakeWord,
'objetivo'=>'desarrollo de material del ciclo'.$e,
'creditos'=>10,
'ciclo'=>$f,
'horas'=>5,
'clave'=>$e.'-car',
'serial'=>'car',
'status'=>0
]);
$material2->carreraMaterial()->sync([13]);
}
}
}
}
}
+5 -2
View File
@@ -18,13 +18,16 @@ class NivelSeeder extends Seeder
'status' => 1
]);
$nivel1->nivelPlantel()->sync(1);
$nivel1->nivelPlantel()->sync([1,2,3]);
Nivel::create([
$nivel2= Nivel::create([
'name' => 'Licenciatura',
'status' => 1
]);
$nivel2->nivelPlantel()->sync([1,2,3]);
Nivel::create([
'name' => 'Maestría',
'status' => 1
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace Database\Seeders;
use App\Models\Plan;
use Illuminate\Database\Seeder;
class PlanSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$plan1=Plan::create([
'name'=> 'Bachillerato',
'rvoe'=>'1234567890',
'duracion'=>6,
'duration_id'=>1,
'nivel'=>1,
'carrera'=>2
]);
$plan1->planesPlantel()->sync([1,2,3]);
$plan2=Plan::create([
'name'=> 'Licenciatura',
'rvoe'=>'1234567890',
'duracion'=>10,
'duration_id'=>2,
'nivel'=>2,
'carrera'=>14
]);
$plan2->planesPlantel()->sync([1,2,3]);
}
}
+10 -1
View File
@@ -11,9 +11,18 @@ class PlaneSeeder extends Seeder
public function run(): void
{
Plane::create([
$plan1=Plane::create([
'name' => 'BACHILLERATO',
'status' => 1
]);
$plan1->planPlantel()->sync([1,2,3]);
$plan2=Plane::create([
'name' => 'LICENCIATURA',
'status' => 1
]);
$plan2->planPlantel()->sync([1,2,3]);
}
}
+26 -11
View File
@@ -8,20 +8,21 @@ use Spatie\Permission\Models\Permission;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$role1 = Role::create(['name'=>'Admin']);
$role2 = Role::create(['name'=>'Blogger']);
$role2 = Role::create(['name'=>'Programador']);
$role3 = Role::create(['name'=>'Promotor']);
$role4 = Role::create(['name'=>'Alumno']);
$role5 = Role::create(['name'=>'Control escolar']);
$role6 = Role::create(['name'=>'Coordinación académica']);
$role7 = Role::create(['name'=>'Docente']);
Permission::create(['name'=>'note.index','description'=>'Ver notas'])->syncRoles([$role2]);
Permission::create(['name'=>'note.create','description'=>'Crear notas'])->syncRoles([$role2]);
Permission::create(['name'=>'note.edit','description'=>'Editar notas'])->syncRoles([$role2]);
Permission::create(['name'=>'note.destroy','description'=>'Eliminar notas'])->syncRoles([$role2]);
Permission::create(['name'=>'note.index','description'=>'Ver notas'])->syncRoles([$role1,$role2,$role3,$role4,$role5]);
Permission::create(['name'=>'note.create','description'=>'Crear notas'])->syncRoles([$role1,$role2,$role3,$role4,$role5]);
Permission::create(['name'=>'note.edit','description'=>'Editar notas'])->syncRoles([$role1,$role2,$role3,$role4,$role5]);
Permission::create(['name'=>'note.destroy','description'=>'Eliminar notas'])->syncRoles([$role1,$role2,$role3,$role4,$role5]);
Permission::create(['name'=>'user.index','description'=>'Ver usuarios'])->syncRoles([$role1]);
Permission::create(['name'=>'user.create','description'=>'Crear usuarios'])->syncRoles([$role1]);
@@ -68,10 +69,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'=>'alumno.index','description'=>'Ver alumnos'])->syncRoles([$role1,$role3]);
Permission::create(['name'=>'alumno.index','description'=>'Ver alumnos'])->syncRoles([$role1,$role3,$role5]);
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'=>'alumno.edit','description'=>'Editar alumnos'])->syncRoles([$role1,$role3,$role5]);
Permission::create(['name'=>'alumno.destroy','description'=>'Eliminar alumnos'])->syncRoles([$role1]);
Permission::create(['name'=>'area.index','description'=>'Ver areas'])->syncRoles([$role1]);
Permission::create(['name'=>'area.create','description'=>'Crear areas'])->syncRoles([$role1]);
@@ -120,5 +121,19 @@ class RoleSeeder extends Seeder
Permission::create(['name'=>'horario.edit','description'=>'Editar horario'])->syncRoles([$role1]);
Permission::create(['name'=>'horario.destroy','description'=>'Eliminar horario'])->syncRoles([$role1]);
Permission::create(['name'=>'pago.index','description'=>'Ver pagos'])->syncRoles([$role1,$role3,$role4]);
Permission::create(['name'=>'pago.create','description'=>'Crear pagos'])->syncRoles([$role1,$role3]);
Permission::create(['name'=>'pago.edit','description'=>'Editar pagos'])->syncRoles([$role1]);
Permission::create(['name'=>'pago.destroy','description'=>'Eliminar pagos'])->syncRoles([$role1,$role3]);
Permission::create(['name'=>'grupo.index','description'=>'Ver grupos'])->syncRoles([$role1,$role4,$role5,$role6,$role7]);
Permission::create(['name'=>'grupo.create','description'=>'Crear grupos'])->syncRoles([$role1,$role5]);
Permission::create(['name'=>'grupo.edit','description'=>'Editar grupos'])->syncRoles([$role1,$role5,$role6]);
Permission::create(['name'=>'grupo.destroy','description'=>'Eliminar grupos'])->syncRoles([$role1,$role5]);
Permission::create(['name'=>'docente.index','description'=>'Ver docentes'])->syncRoles([$role1,$role6]);
Permission::create(['name'=>'docente.create','description'=>'Crear docentes'])->syncRoles([$role1,$role6]);
Permission::create(['name'=>'docente.edit','description'=>'Editar docentes'])->syncRoles([$role1,$role6]);
Permission::create(['name'=>'docente.destroy','description'=>'Eliminar docentes'])->syncRoles([$role1,$role6]);
}
}
+13 -1
View File
@@ -17,6 +17,18 @@ class TurnoSeeder extends Seeder
'name'=>'Escolarizado',
'status'=> 1
]);
$turno1->turnoPlantel()->sync(1);
$turno1->turnoPlantel()->sync([1,2,3,4,5,6]);
$turno2=Turno::create([
'name'=>'Sabatíno',
'status'=> 1
]);
$turno2->turnoPlantel()->sync([1,2,3,4,5,6]);
$turno3=Turno::create([
'name'=>'Mixto',
'status'=> 1
]);
$turno3->turnoPlantel()->sync([1,2,3,4,5,6]);
}
}
+48 -13
View File
@@ -2,18 +2,16 @@
namespace Database\Seeders;
use App\Models\Alumno;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$user1= User::create([
$user= User::create([
'name'=>'Luis Fernando',
'apellidoPaterno'=>'Pérez',
'apellidoMaterno'=>'Luna',
@@ -25,19 +23,56 @@ class UserSeeder extends Seeder
'status'=>1
])->assignRole('Admin');
$user1->plantelUsuarios()->sync(1);
$user->plantelUsuarios()->sync(3);
$user2= User::create([
'name'=>'Antonio Azulito',
'apellidoPaterno'=>'Real',
$user1= User::create([
'name'=>'Crokly',
'apellidoPaterno'=>'real',
'apellidoMaterno'=>'Luna',
'email'=>'reydelfin@gmail.com',
'email'=>'fernandoestr61@gmail.com',
'direccion'=>'Zacatenco mz 21 lt 2 san francisco cuautliquixca',
'telefono'=>'5636287758',
'telefono'=>'5636287760',
'password' => bcrypt('6686'),
'code'=>1,
'status'=>1
])->assignRole('Admin');
$user2->plantelUsuarios()->sync([1,2,3]);
])->assignRole('Coordinación académica');
$user1->plantelUsuarios()->sync(3);
for ($e=1; $e <=2 ; $e++) {
for ($i=1; $i <=15; $i++) {
$usr = User::create([
'name'=>fake('es_MX')->firstName(),
'apellidoPaterno'=>fake()->lastName(),
'apellidoMaterno'=>fake()->lastName(),
'email'=> fake()->email(),
'direccion'=>fake()->address(),
'telefono'=>fake()->numerify('55########'),
'password' => bcrypt('6686'),
'code'=>0,
'status'=>1
])->assignRole('Alumno');
$usr->plantelUsuarios()->sync([3]);
$alumno = Alumno::create([
'nivel'=>$e,
'plan_id'=>$e,
'ciclo'=>3,
'turno'=>1,
'medio'=>1,
'usuario_registro'=>1,
'plane_id'=>0,
'status'=>2
]);
$alumno->alumnos()->sync($usr->id);
}
}
}
}
+33
View File
@@ -0,0 +1,33 @@
@extends('layouts.landing')
@section('title',"Edit")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Editar alumno</h6>
<a href="{{route('alumno.index')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Regresar</a>
</div>
</div>
<div class="card-body">
@if (session('info'))
<div class="alert alert-success">
<strong>{{session('info')}}</strong>
</div>
@endif
<form action="{{ route('alumno.update', $alumno->id) }}" method="POST">
@csrf
@method('PUT')
<input class="btn btn-primary" type="submit" value="Actualizar">
</form>
</div>
</div>
</div>
@endsection
+96
View File
@@ -11,7 +11,13 @@
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
@hasrole('Promotor')
<h6 class="m-0 font-weight-bold text-primary">Prospectos</h6>
@endrole
@hasrole('Control escolar')
<h6 class="m-0 font-weight-bold text-primary">Alumnos</h6>
@endrole
@can('alumno.create')
<button onclick="Livewire.dispatch('create-prospecto')" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Agregar</button>
@endcan
@@ -19,6 +25,8 @@
</div>
<div class="card-body row">
@hasrole('Promotor')
<div class="col-sm-2 overflow-auto" style="height: 80vh">
<div class="list-group">
@forelse ($alumnos as $alumno)
@@ -56,6 +64,94 @@
</div>
@livewire('modal-prospecto')
@endrole
@hasrole('Control escolar')
<table id="tcont" class="table table-striped table-bordered nowrap table-hover" style="width:100%;">
<thead>
<tr>
<th>Id</th>
<th>Alumno</th>
<th>Campus</th>
<th>Status</th>
<th>Opciones</th>
</tr>
</thead>
<tbody>
@forelse ($alumnos as $alumno)
<tr style="width:100%">
<td>{{ $alumno->id }}</td>
<td>
@foreach($alumno->alumnos as $user)
<a href="{{ route('alumno.show', $alumno->id) }}">
{{ $user->name }}
</a>
@endforeach
</td>
<td class="text-center">
@foreach($alumno->alumnos as $user)
@forelse($user->plantelUsuarios as $plantel)
<span class="badge bg-primary text-white">
{{ $plantel->name }}
</span>
@empty
<span class="text-muted">Sin plantel</span>
@endforelse
@endforeach
</td>
<td class="text-center">
@if ($alumno->status==2) <span class="badge bg-warning text-white"> @endif
@if ($alumno->status==3) <span class="badge bg-success text-white"> @endif
@if ($alumno->status==4) <span class="badge bg-danger text-white"> @endif
@if ($alumno->status==5) <span class="badge bg-dark text-white"> @endif
@if ($alumno->status==6) <span class="badge text-white" style="background-color: #630ac9"> @endif
{{ $alumno->statusAlumno->name }}
</span>
</td>
<td class="row mx-auto">
@can('alumno.edit')
<div class="col-sm-6 col-md-6">
<a class="btn btn-primary" href="{{ route('alumno.edit',$alumno->id) }}">
Edit
</a>
</div>
@endcan
@can('alumno.destroy')
<div class="col-sm-6 col-md-6">
<form class="delete-form" action="{{ route('alumno.destroy',$alumno->id) }}" method="POST">
@csrf
@method('DELETE')
<input type="submit" value="DELETE" class="btn btn-danger">
</form>
</div>
@endcan
</td>
</tr>
@empty
<tr>
<td colspan="4">Sin alumnos.</td>
</tr>
@endforelse
</tbody>
</table>
@endrole
</div>
</div>
+1 -1
View File
@@ -57,7 +57,7 @@
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Materiales</h6>
<h6 class="m-0 font-weight-bold text-primary">Materias</h6>
@can('material.create')
<button onclick="Livewire.dispatch('create-material')" class="d-sm-inline-block btn btn-sm btn-success shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Agregar</button>
@endcan
+73
View File
@@ -0,0 +1,73 @@
@extends('layouts.landing')
@section('title',"Crear")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Crear grupo</h6>
<a href="{{route('grupo.index')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Regresar</a>
</div>
</div>
<div class="card-body">
<form action="{{route('grupo.store')}}" method="POST">
@csrf
<div class="mb-3">
<label for="status">Seleccionar Carrera</label>
<select class="form-control" name="plan_id">
<option value="">Seleccionar plan</option>
@foreach ($plans as $nivel => $grupo)
<optgroup label="{{ $nivel }}">
@foreach ($grupo as $plan)
<option value="{{ $plan->id }}">
{{ $plan->carreraRel->name }}
({{ $plan->name }}-{{ $plan->rvoe }})
</option>
@endforeach
</optgroup>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar turno</label>
<select class="form-control" name="turno">
<option value="0">Seleccionar turno</option>
@foreach ($turnos as $turno)
<option value="{{ $turno->id }}">{{$turno->name}}</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar plantel</label>
<select class="form-control" name="plantel">
<option value="0">Seleccionar plantel</option>
@foreach ($planteles as $plantel)
<option value="{{ $plantel->id }}">{{$plantel->name}}</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar status</label>
<select class="form-control" name="status" id="status">
<option value="1">Activo</option>
<option value="0">Inactivo</option>
</select>
</div>
<input class="btn btn-primary" type="submit" value="Crear">
</form>
</div>
</div>
</div>
@endsection
+171
View File
@@ -0,0 +1,171 @@
@extends('layouts.landing')
@section('title',"Editar")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Editar grupo</h6>
<a href="{{route('grupo.index')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Regresar</a>
</div>
</div>
<div class="card-body">
<form action="{{route('grupo.update',$grupo->id)}}" method="POST">
@method('PUT')
@csrf
<div class="mb-3">
<label for="status">Seleccionar Carrera</label>
<select class="form-control" name="plan_id">
<option value="">Seleccionar plan</option>
@foreach ($plans as $nivel => $grupos)
<optgroup label="{{ $nivel }}">
@foreach ($grupos as $plan)
<option value="{{ $plan->id }}" {{ $plan->id == $grupo->id ? 'selected' : '' }}>
{{ $plan->carreraRel->name }}
({{ $plan->name }}-{{ $plan->rvoe }})
</option>
@endforeach
</optgroup>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar ciclo</label>
<select class="form-control" name="ciclo">
<option value="0">Seleccionar ciclo</option>
@for ($i=1 ; $i <= $ciclos->duracion ; $i++)
<option value="{{ $i }}" @selected($i == $grupo->ciclo)>{{$i}}</option>
@endfor
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar turno</label>
<select class="form-control" name="turno">
<option value="0">Seleccionar turno</option>
@foreach ($turnos as $turno)
<option value="{{ $turno->id }}" {{ $turno->id == $grupo->turno ? 'selected' : '' }}>{{$turno->name}}</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar plantel</label>
<select class="form-control" name="plantel">
<option value="0">Seleccionar plantel</option>
@foreach ($planteles as $plantel)
<option value="{{ $plantel->id }}" {{ $plantel->id == $grupo->plantel ? 'selected' : '' }}>{{$plantel->name}}</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar status</label>
<select class="form-control" name="status" id="status">
<option value="1" {{ 1 == $grupo->status ? 'selected' : '' }}>Activo</option>
<option value="0" {{ 0 == $grupo->status ? 'selected' : '' }}>Inactivo</option>
</select>
</div>
<input class="btn btn-primary" type="submit" value="Guardar">
</form>
</div>
</div>
{{-- contenedor de materias --}}
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Alumnos</h6>
@can('grupo.create')
<button onclick="Livewire.dispatch('create-grupo')" class="d-sm-inline-block btn btn-sm btn-success shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Agregar</button>
@endcan
</div>
</div>
<div class="card-body">
@if (session('infogrupo'))
<div class="alert alert-success">
<strong>{{session('infogrupo')}}</strong>
</div>
@endif
<div class="container-fluid">
<table id="tcont" class="table table-striped table-bordered nowrap table-hover" style="width:100%;">
<thead>
<tr>
<th>Id</th>
<th>Nombre</th>
<th>Opciones</th>
</tr>
</thead>
<tbody>
@forelse ($grupo->alumnos as $alumno)
<tr style="width:100%">
<td>{{$alumno->id}}</td>
<td>{{$alumno->usuario->first()?->name}} {{$alumno->usuario->first()?->apellidoPaterno}} {{$alumno->usuario->first()?->apellidoMaterno}}</td>
<td>
@can('grupo.destroy')
<div>
<form class="delete-form" action="{{route('grupo.destroy',$grupo->id)}}" method="POST">
@csrf
@method('DELETE')
<input class="d-none" name="alumno" value="{{$alumno->id}}">
<button type="submit" style="border:none; background:none;">
<i class="fa-duotone fa-regular fa-circle-user-circle-xmark fa-2xl" style="--fa-primary-color: rgb(172, 5, 18); --fa-secondary-color: rgb(245, 112, 123);"></i>
</button>
</form>
</div>
@endcan
</td>
</tr>
@empty
<p>Sin alumnos.</p>
@endforelse
</tbody>
</table>
</div>
<livewire:grupo-alumno :grupo="$grupo"/>
</div>
</div>
</div>
@endsection
@section('scripts')
@include('layouts._partials.tablaScript')
@include('layouts._partials.delete')
<script>
document.addEventListener('livewire:init', () => {
Livewire.on('open-grupo-modal', () => {
$('#exampleModal').modal('show');
});
});
document.addEventListener('livewire:init', () => {
Livewire.on('close-modal', () => {
$('#exampleModal').modal('hide');
});
});
</script>
@endsection
+75
View File
@@ -0,0 +1,75 @@
@extends('layouts.landing')
@section('head')
@include('layouts._partials.tablaStyle')
@endsection
@section('title',"Inicio")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">grupos</h6>
@can('grupo.create')
<a href="{{route('grupo.create')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Crear Grupo</a>
@endcan
</div>
</div>
<div class="card-body">
<div class="container-fluid">
<table id="tcont" class="table table-striped table-bordered nowrap table-hover" style="width:100%;">
<thead>
<tr>
<th>Id</th>
<th>Nombre</th>
<th>Opciones</th>
</tr>
</thead>
<tbody>
@forelse ($grupos as $grupo)
<tr style="width:100%">
<td>{{$grupo->id}}</td>
<td><a href="{{route('grupo.show',$grupo->id)}}">{{ $grupo->plan->carreraRel->name }}
({{ $grupo->plan->name }}-{{ $grupo->plan->rvoe }})</a></td>
<td class="row mx-auto">
@can('grupo.edit')
<div class="col-sm-6 col-md-6"><a class="btn btn-primary" href="{{route('grupo.edit',$grupo->id)}}">Edit</a></div>
@endcan
@can('grupo.destroy')
<div class="col-sm-6 col-md-6">
<form class="delete-form" action="{{route('grupo.destroy',$grupo->id)}}" method="POST">
@csrf
@method('DELETE')
<input type="submit" value="DELETE" class="btn btn-danger">
</form>
</div>
@endcan
</td>
</tr>
@empty
<p>Sin grupos.</p>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection
@section('scripts')
@include('layouts._partials.tablaScript')
@include('layouts._partials.delete')
@endsection
+23
View File
@@ -0,0 +1,23 @@
@extends('layouts.landing')
@section('title',"show")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Datos carrera</h6>
<a href="{{route('carrera.index')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Regresar</a>
</div>
</div>
<div class="card-body">
<h1>{{$carrera->name}}</h1>
</div>
</div>
</div>
@endsection
@@ -1,23 +1,26 @@
<script>
forms= document.querySelectorAll('.delete-form');
document.addEventListener('submit', function (e) {
if (!e.target.classList.contains('delete-form')) return;
if (e.target.dataset.confirmed) return;
forms.forEach(form => {
form.addEventListener('submit',(e)=>{
e.preventDefault();
Swal.fire({
title: "Eliminar registro",
text: "estas seguro?",
text: "¿Estás seguro?",
icon: "warning",
showCancelButton: true,
confirmButtonText: "Eliminar",
cancelButtonText: "regresar",
cancelButtonText: "Regresar",
}).then((result) => {
if (result.isConfirmed) {
form.submit();
e.target.dataset.confirmed = true;
e.target.submit();
}
});
});
});
</script>
@@ -128,12 +128,63 @@
</li>
@endrole
@hasrole('Control escolar')
<li class="nav-item">
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#ControlEscolar"
aria-expanded="true" aria-controls="ControlEscolar">
<i class="fas fa-fw fa-bullhorn" style="color: #e8e8e8;"></i>
<span>Control Escolar</span>
</a>
<div id="ControlEscolar" class="collapse" aria-labelledby="ControlEscolar" data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">Herramientas</h6>
@can('alumno.index')
<a class="collapse-item" href="{{ route('alumno.index') }}" style="color:#85888e">Alumnos</a>
@endcan
@can('grupo.index')
<a class="collapse-item" href="{{ route('grupo.index') }}" style="color:#85888e">Grupos</a>
@endcan
</div>
</div>
</li>
@endrole
@hasrole('Coordinación académica')
<li class="nav-item">
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#CoordinacionAcademica"
aria-expanded="true" aria-controls="CoordinacionAcademica">
<i class="fas fa-fw fa-bullhorn" style="color: #e8e8e8;"></i>
<span>Coordinación académica</span>
</a>
<div id="CoordinacionAcademica" class="collapse" aria-labelledby="CoordinacionAcademica" data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">Herramientas</h6>
{{-- @can('docente.index')
<a class="collapse-item" href="{{ route('docente.index') }}" style="color:#85888e">Docentes</a>
@endcan --}}
@can('grupo.index')
<a class="collapse-item" href="{{ route('grupo.index') }}" style="color:#85888e">Grupos</a>
@endcan
</div>
</div>
</li>
@endrole
@hasrole(['Alumno'])
@can('pago.index')
<li class="nav-item">
<a class="nav-link" href="{{ route('pago.index') }}">
<i class="fas fa-money-bill-alt" style="color: #e8e8e8;"></i>
<span>Mis pagos</span></a>
</li>
@endcan
@endrole
@@ -0,0 +1,58 @@
<div wire:ignore.self class="modal fade" id="exampleModal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-xl" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Agregar alumnos a grupo</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="mb-3">
<table id="tcont" class="table table-striped table-bordered nowrap table-hover" style="width:100%;">
<thead>
<tr>
<th>Seleccionar</th>
<th>Id</th>
<th>Nombre</th>
<th>Nivel</th>
<th>Carrera</th>
</tr>
</thead>
<tbody>
@forelse ($alumnos as $alumno)
<tr style="width:100%">
<td class="text-center">
<div class="form-check">
<input type="checkbox" class="form-check-input cb"
wire:model="selectedAlumnos" value="{{ $alumno->id }}">
</div>
</td>
<td>{{$alumno->id}}</td>
<td>{{$alumno->usuario->first()?->name}} {{$alumno->usuario->first()?->apellidoPaterno}} {{$alumno->usuario->first()?->apellidoMaterno}}</td>
<td>{{$alumno->nivelRel?->name}}</td>
<td>
{{$alumno->plan?->carreraRel?->name}}
</td>
</tr>
@empty
<p>Sin alumnos.</p>
@endforelse
</tbody>
</table>
</div>
<button wire:click="guardar" class="btn btn-primary">
Agregar
</button>
</div>
</div>
</div>
</div>
+2
View File
@@ -10,6 +10,7 @@ use App\Http\Controllers\ChatController;
use App\Http\Controllers\CodeController;
use App\Http\Controllers\ConceptoController;
use App\Http\Controllers\DurationController;
use App\Http\Controllers\GrupoController;
use App\Http\Controllers\HorarioController;
use App\Http\Controllers\MailController;
use App\Http\Controllers\MaterialController;
@@ -55,6 +56,7 @@ Route::middleware(['auth:sanctum',config('jetstream.auth_session'),'verified',
Route::post('/chat/typing', function (Request $request) {broadcast(new \App\Events\UserTyping($request->conversation_id,auth()->user()))->toOthers();return response()->json();});
Route::post('/chat/stop-typing', function (Request $request) {broadcast(new \App\Events\UserStoppedTyping($request->conversation_id,auth()->user()))->toOthers();return response()->json();});
Route::resource('/duration',DurationController::class);
Route::resource('/grupo', GrupoController::class);
Route::get('/horario', [HorarioController::class, 'index'])->name('horario.index');
Route::get('/horario/create', [HorarioController::class, 'create'])->name('horario.create');
Route::post('/horario', [HorarioController::class, 'store'])->name('horario.store');