diff --git a/app/Http/Controllers/HorarioController.php b/app/Http/Controllers/HorarioController.php index 51df1041..58b00bb4 100644 --- a/app/Http/Controllers/HorarioController.php +++ b/app/Http/Controllers/HorarioController.php @@ -3,72 +3,122 @@ namespace App\Http\Controllers; use App\Models\Horario; -use Illuminate\Routing\Controller; +use App\Models\User; +use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Routing\Controller; class HorarioController extends Controller { public function __construct() { - $this->middleware('can:areacode.index')->only('index','show'); - $this->middleware('can:areacode.create')->only('create','store'); - $this->middleware('can:areacode.edit')->only('edit','update'); - $this->middleware('can:areacode.destroy')->only('destroy'); + $this->middleware('can:horario.index')->only('index','show'); + $this->middleware('can:horario.create')->only('create','store'); + $this->middleware('can:horario.edit')->only('edit','update'); + $this->middleware('can:horario.destroy')->only('destroy'); } public function index() { - $areacodes = Horario::all(); - return view('areacode.index',compact('areacodes')); + $usuarios = User::with(['roles'])->has('horarios')->get(); + + return view('horario.index',compact('usuarios')); } public function create() { - return view('areacode.create'); + $usuarios = User::where('code','!=','0')->get(); + + $inicioSemana = Carbon::now()->startOfWeek(); + + $dias = []; + for ($i = 0; $i < 7; $i++) { + // Clonamos la fecha de inicio y sumamos los días necesarios + $dias[] = $inicioSemana->copy()->addDays($i); + } + + return view('horario.create',compact('usuarios','dias')); } public function store(Request $request) { - $request->validate([ - 'name'=>'required' - ]); - $areacode = AreaCode::create($request->all()); + foreach($request->horarios as $h){ - return redirect()->route('areacode.edit',$areacode)->with('info','El código se creo correctamente'); + $horario = Horario::create([ + 'user_id'=>$request->user_id, + 'dia'=>$h['dia'], + 'entrada'=>$h['entrada'], + 'comidas'=>$h['comida_salida'], + 'comidar'=>$h['comida_regreso'], + 'salida'=>$h['salida'], + 'status'=>$h['activo'] ?? 0, + ]); + } + + return redirect()->route('horario.edit',$request->user_id)->with('info','El horario se creo correctamente'); } + public function edit(User $user) + { + $user->load('horarios'); + + $usuarios = User::where('code','!=','0')->get(); + + // Generar semana actual + $inicioSemana = Carbon::now()->startOfWeek(); + + $dias = []; + for ($i = 0; $i < 7; $i++) { + $dias[] = $inicioSemana->copy()->addDays($i); + } + + // Normalizar dias en minusculas + $horarios = $user->horarios->keyBy(function($item){ + return strtolower($item->dia); + }); + + return view('horario.edit', compact('user','usuarios','dias','horarios')); + } + + + public function update(Request $request, User $user) + { + foreach ($request->horarios as $h) { + + Horario::updateOrCreate( + [ + 'user_id' => $user->id, + 'dia' => strtolower($h['dia']), + ], + [ + 'entrada' => $h['entrada'] ?? null, + 'comidas' => $h['comida_salida'] ?? null, + 'comidar' => $h['comida_regreso'] ?? null, + 'salida' => $h['salida'] ?? null, + 'status' => $h['activo'] ?? 0, + ] + ); + } + + return redirect() + ->route('horario.edit', $user->id) + ->with('info','Horario actualizado correctamente'); + } public function show(Horario $horario) { - return view('areacode.show',compact('areacode')); + + return view('horario.show',compact('areacode')); } - - public function edit(Horario $horario) - { - return view('areacode.edit',compact('areacode')); - } - - - public function update(Request $request, Horario $horario) - { - $request->validate([ - 'name'=>'required' - ]); - - $areacode->update($request->all()); - return redirect()->route('areacode.edit',$areacode)->with('info','El código se actualizo correctamente'); - } - - public function destroy(Horario $horario) { - $areacode->delete(); - session()->flash('swal',[ - 'icon'=>'success', - 'title'=>'Eliminado!', - 'text'=>'Se ha eliminado el registro correctamente' - ]); - return redirect()->route('areacode.index'); + // $areacode->delete(); + // session()->flash('swal',[ + // 'icon'=>'success', + // 'title'=>'Eliminado!', + // 'text'=>'Se ha eliminado el registro correctamente' + // ]); + // return redirect()->route('horario.index'); } } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index b921ed83..3edda282 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -3,11 +3,15 @@ namespace App\Http\Controllers; use App\Models\AreaCode; -use App\Models\User; use App\Models\Plantel; +use App\Models\User; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Password; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Str; use Spatie\Permission\Models\Role; +use Illuminate\Auth\Notifications\ResetPassword; class UserController extends Controller { @@ -21,9 +25,8 @@ class UserController extends Controller public function index() { - $plantels=Plantel::all(); - $users=User::with('roles')->get(); - return view('user.index',compact('users','plantels')); + $users=User::with(['roles','plantelUsuarios'])->get(); + return view('user.index',compact('users')); } @@ -35,13 +38,27 @@ class UserController extends Controller return view('user.create',compact('roles','plantels','codigos')); } - public function store(Request $request,User $user) + public function store(Request $request) { - $user= User::create($request->except(['plantels'])); + $passwordTemporal = Str::random(12); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'telefono' => $request->telefono ?? null, + 'direccion' => $request->direccion ?? null, + 'code' => $request->code ?? null, + 'status' => $request->status, + 'password' => Hash::make($passwordTemporal), + ]); + $user->roles()->sync($request->roles); $user->plantelUsuarios()->sync($request->plantels); + $token = Password::createToken($user); + $user->notify(new ResetPassword($token)); + return redirect()->route('user.edit',compact('user'))->with('info','Se creó el usuario correctamente'); } diff --git a/app/Mail/UserCreated.php b/app/Mail/UserCreated.php new file mode 100644 index 00000000..67ad7f4c --- /dev/null +++ b/app/Mail/UserCreated.php @@ -0,0 +1,52 @@ +belongsTo(User::class); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 9e0ac57f..3537c645 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -69,6 +69,11 @@ class User extends Authenticatable return $this->hasMany(Note::class); } + public function horarios() : HasMany + { + return $this->hasMany(Horario::class); + } + public function codes() : HasMany { return $this->hasMany(Code::class); diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index 8f7a5be5..565f12b4 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -19,7 +19,7 @@ return new class extends Migration $table->string('telefono',20)->nullable()->unique(); $table->string('direccion')->nullable(); $table->string('password'); - $table->string('code')->nullable(); + $table->string('code')->default(0); $table->boolean('status'); $table->rememberToken(); $table->foreignId('current_team_id')->nullable(); diff --git a/database/migrations/2026_02_20_122434_create_horarios_table.php b/database/migrations/2026_02_20_122434_create_horarios_table.php index cf27e5ce..aad7ed6d 100644 --- a/database/migrations/2026_02_20_122434_create_horarios_table.php +++ b/database/migrations/2026_02_20_122434_create_horarios_table.php @@ -6,19 +6,21 @@ use Illuminate\Support\Facades\Schema; return new class extends Migration { - /** - * Run the migrations. - */ + public function up(): void { Schema::create('horarios', function (Blueprint $table) { $table->id(); + $table->unsignedBigInteger('user_id'); + $table->string('dia'); + $table->time('entrada')->nullable(); + $table->time('comidas')->nullable(); + $table->time('comidar')->nullable(); + $table->time('salida')->nullable(); + $table->boolean('status'); }); } - /** - * Reverse the migrations. - */ public function down(): void { Schema::dropIfExists('horarios'); diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php index 72ed0bab..ada379eb 100644 --- a/database/seeders/RoleSeeder.php +++ b/database/seeders/RoleSeeder.php @@ -121,5 +121,10 @@ class RoleSeeder extends Seeder Permission::create(['name'=>'mail.edit','description'=>'Editar mail'])->syncRoles([$role1]); Permission::create(['name'=>'mail.destroy','description'=>'Eliminar mail'])->syncRoles([$role1]); + Permission::create(['name'=>'horario.index','description'=>'Ver horario'])->syncRoles([$role1]); + Permission::create(['name'=>'horario.create','description'=>'Crear horario'])->syncRoles([$role1]); + Permission::create(['name'=>'horario.edit','description'=>'Editar horario'])->syncRoles([$role1]); + Permission::create(['name'=>'horario.destroy','description'=>'Eliminar horario'])->syncRoles([$role1]); + } } diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index 9ac40d1c..481e2e74 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -13,27 +13,27 @@ class UserSeeder extends Seeder */ public function run(): void { - $user1= User::create([ - 'name'=>'Luis Fernando Pérez', - 'email'=>'fernandoestrp@outlook.es', - 'direccion'=>'Zacatenco mz 21 lt 2 san francisco cuautliquixca', - 'telefono'=>'5636287759', - 'password' => bcrypt('6686'), - 'code'=>1, - 'status'=>1 - ])->assignRole('Admin'); + // $user1= User::create([ + // 'name'=>'Luis Fernando Pérez', + // 'email'=>'fernandoestrp@outlook.es', + // 'direccion'=>'Zacatenco mz 21 lt 2 san francisco cuautliquixca', + // 'telefono'=>'5636287759', + // 'password' => bcrypt('6686'), + // 'code'=>1, + // 'status'=>1 + // ])->assignRole('Admin'); - $user1->plantelUsuarios()->sync(1); + // $user1->plantelUsuarios()->sync(1); $user2= User::create([ 'name'=>'Antonio Azulito Real Luna', 'email'=>'reydelfin@gmail.com', 'direccion'=>'Zacatenco mz 21 lt 2 san francisco cuautliquixca', 'telefono'=>'5636287758', - 'password' => bcrypt('2000'), + 'password' => bcrypt('6686'), 'code'=>1, 'status'=>1 - ])->assignRole('Promotor'); + ])->assignRole('Admin'); $user2->plantelUsuarios()->sync([1,2,3]); } } diff --git a/resources/views/emails/welcome-user.blade.php b/resources/views/emails/welcome-user.blade.php new file mode 100644 index 00000000..e69de29b diff --git a/resources/views/horario/create.blade.php b/resources/views/horario/create.blade.php new file mode 100644 index 00000000..b9bc62a8 --- /dev/null +++ b/resources/views/horario/create.blade.php @@ -0,0 +1,83 @@ +@extends('layouts.landing') + +@section('title',"Crear") + +@section('content') + +
| Id | +Colaborador | +Campus | +Opciones | +
|---|---|---|---|
| {{$usuario->id}} | +{{$usuario->name}} | ++ @forelse($usuario->plantelUsuarios as $plantel) + + {{ $plantel->name }} + + @empty + Sin plantel + @endforelse + | +
+ @can('horario.edit')
+
+ @endcan
+
+ @can('horario.destroy')
+
+
+
+ @endcan
+
+ |
+
{{$note->description}}
+