Se crean las especificaciones de los documentos a requerir por nivel, a su vez permitir al alumno subirlos
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\DocumentoTipo;
|
||||
use App\Models\Nivel;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
|
||||
class DocumentoTipoController extends Controller
|
||||
{
|
||||
public function __construct() {
|
||||
$this->middleware('can:documentoTipo.index')->only('index','show');
|
||||
$this->middleware('can:documentoTipo.create')->only('create','store');
|
||||
$this->middleware('can:documentoTipo.edit')->only('edit','update');
|
||||
$this->middleware('can:documentoTipo.destroy')->only('destroy');
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$documentotipos=DocumentoTipo::all();
|
||||
return view('documento.index',compact('documentotipos'));
|
||||
}
|
||||
|
||||
|
||||
public function create()
|
||||
{
|
||||
$nivels = Nivel::where('status','=','1')->get();
|
||||
return view('Documento.create',compact('nivels'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'name' => 'required',
|
||||
'slug' => 'required|unique:documento_tipos,slug',
|
||||
'extensiones' => 'required|array'
|
||||
]);
|
||||
|
||||
$documentotipo=DocumentoTipo::create([
|
||||
'name' => $request->name,
|
||||
'slug' => $request->slug,
|
||||
'extensiones' => $request->extensiones
|
||||
]);
|
||||
|
||||
$documentotipo->niveles()->sync($request->nivels ?? []);
|
||||
|
||||
return redirect()->route('documentotipo.edit',compact('documentotipo'))->with('info','Se creó la la documentación correctamente');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(DocumentoTipo $documentotipo)
|
||||
{
|
||||
$documentotipo->load('niveles');
|
||||
$nivels = Nivel::where('status','=','1')->get();
|
||||
return view('documento.edit',compact(['documentotipo','nivels']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, DocumentoTipo $documentotipo)
|
||||
{
|
||||
$documentotipo->update([
|
||||
'name' => $request->name,
|
||||
'slug' => $request->slug,
|
||||
'extensiones' => $request->extensiones
|
||||
]);
|
||||
|
||||
$documentotipo->niveles()->sync($request->nivels ?? []);
|
||||
|
||||
return redirect()->route('documentotipo.edit',compact('documentotipo'))->with('info','Se modificó la la documentación correctamente');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(DocumentoTipo $documentotipo)
|
||||
{
|
||||
$documentotipo->niveles()->detach();
|
||||
$documentotipo->delete();
|
||||
|
||||
session()->flash('swal',[
|
||||
'icon'=>'success',
|
||||
'title'=>'Eliminado!',
|
||||
'text'=>'Se han eliminado los registros correctamente'
|
||||
]);
|
||||
return redirect()->route('documentotipo.index');
|
||||
}
|
||||
}
|
||||
+55
-56
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace App\Livewire;
|
||||
|
||||
use App\Models\Alumno;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Livewire\Attributes\On;
|
||||
use Livewire\Component;
|
||||
@@ -12,13 +11,10 @@ class Documentos extends Component
|
||||
{
|
||||
use WithFileUploads;
|
||||
|
||||
public $curp;
|
||||
public $acta;
|
||||
public $comprobante;
|
||||
public $user;
|
||||
|
||||
public $archivos = [];
|
||||
public $alumno;
|
||||
public $documentosPorTipo = [];
|
||||
public $tiposDocumentos = [];
|
||||
|
||||
#[On('documentos')]
|
||||
public function documentos()
|
||||
@@ -27,73 +23,76 @@ class Documentos extends Component
|
||||
}
|
||||
|
||||
public function cargarDocumentos()
|
||||
{
|
||||
$this->alumno = Auth::user()->alumnos()->first();
|
||||
{
|
||||
$this->alumno = Auth::user()
|
||||
->alumnos()
|
||||
->with('nivelRel.documentosRequeridos')
|
||||
->first();
|
||||
|
||||
if ($this->alumno) {
|
||||
$this->documentosPorTipo = $this->alumno
|
||||
->documentos()
|
||||
->get()
|
||||
->keyBy('tipo');
|
||||
if ($this->alumno) {
|
||||
|
||||
$this->documentosPorTipo = $this->alumno
|
||||
->documentos()
|
||||
->get()
|
||||
->keyBy('tipo');
|
||||
|
||||
$this->tiposDocumentos = $this->alumno->nivelRel
|
||||
? $this->alumno->nivelRel->documentosRequeridos
|
||||
: collect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function store()
|
||||
{
|
||||
|
||||
$this->validate([
|
||||
'curp' => 'nullable|file|mimes:pdf,jpg,png',
|
||||
'acta' => 'nullable|file|mimes:pdf,jpg,png',
|
||||
'comprobante' => 'nullable|file|mimes:pdf,jpg,png',
|
||||
]);
|
||||
|
||||
$alumno = Auth::user()->alumnos->first();
|
||||
|
||||
if (!$alumno) {
|
||||
if (!$this->alumno) {
|
||||
abort(404, 'Alumno no encontrado');
|
||||
}
|
||||
|
||||
$tipos = ['curp', 'acta', 'comprobante'];
|
||||
$rules = [];
|
||||
|
||||
foreach ($tipos as $tipo) {
|
||||
|
||||
if ($this->$tipo) {
|
||||
|
||||
$ruta = $this->$tipo->store('documentos', 'public');
|
||||
|
||||
$alumno->documentos()->updateOrCreate(
|
||||
['tipo' => $tipo],
|
||||
[
|
||||
'archivo' => $ruta,
|
||||
'status' => 0
|
||||
]
|
||||
);
|
||||
foreach ($this->tiposDocumentos as $tipo) {
|
||||
$rules["archivos.{$tipo->slug}"] =
|
||||
'nullable|file|mimes:' . implode(',', $tipo->extensiones);
|
||||
}
|
||||
}
|
||||
|
||||
// 🔥 recargar correctamente
|
||||
$this->cargarDocumentos();
|
||||
$this->validate($rules);
|
||||
|
||||
$this->reset(['curp', 'acta', 'comprobante']);
|
||||
foreach ($this->tiposDocumentos as $tipo) {
|
||||
|
||||
$this->dispatch('close-documentos-modal');
|
||||
if (isset($this->archivos[$tipo->slug])) {
|
||||
|
||||
$this->dispatch('swal',
|
||||
icon: 'success',
|
||||
title: 'Éxito!',
|
||||
text: 'Documentos cargados',
|
||||
timer: 2000,
|
||||
confirm: false,
|
||||
closeModal: true,
|
||||
reload: 2000
|
||||
);
|
||||
$ruta = $this->archivos[$tipo->slug]->store('documentos', 'public');
|
||||
|
||||
$this->alumno->documentos()->updateOrCreate(
|
||||
['tipo' => $tipo->slug],
|
||||
[
|
||||
'archivo' => $ruta,
|
||||
'status' => 0
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$this->cargarDocumentos();
|
||||
|
||||
$this->reset('archivos');
|
||||
|
||||
$this->dispatch('close-documentos-modal');
|
||||
|
||||
$this->dispatch('swal',
|
||||
icon: 'success',
|
||||
title: 'Éxito!',
|
||||
text: 'Documentos cargados',
|
||||
timer: 2000,
|
||||
confirm: false,
|
||||
closeModal: true
|
||||
);
|
||||
}
|
||||
|
||||
public function mount()
|
||||
{
|
||||
$this->cargarDocumentos();
|
||||
}
|
||||
{
|
||||
$this->cargarDocumentos();
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class DocumentoTipo extends Model
|
||||
{
|
||||
protected $guarded = [];
|
||||
public $timestamps = false;
|
||||
|
||||
protected $casts = [
|
||||
'extensiones' => 'array',
|
||||
];
|
||||
|
||||
public function niveles()
|
||||
{
|
||||
return $this->belongsToMany(
|
||||
Nivel::class,
|
||||
'nivel_documento',
|
||||
'documento_tipo_id',
|
||||
'nivel_id'
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -32,4 +32,14 @@ class Nivel extends Model
|
||||
->wherePivot('plantel_id', $plantelId)
|
||||
->exists();
|
||||
}
|
||||
|
||||
public function documentosRequeridos()
|
||||
{
|
||||
return $this->belongsToMany(
|
||||
DocumentoTipo::class,
|
||||
'nivel_documento',
|
||||
'nivel_id',
|
||||
'documento_tipo_id'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user