|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Administracion;
|
|
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
|
|
|
|
use App\Models\ProcesoAdmision;
|
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
|
use Illuminate\Support\Str;
|
|
|
|
|
use Illuminate\Validation\Rule;
|
|
|
|
|
|
|
|
|
|
class ProcesoAdmisionController extends Controller
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
public function index(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$q = ProcesoAdmision::query();
|
|
|
|
|
|
|
|
|
|
if ($request->filled('q')) {
|
|
|
|
|
$term = $request->string('q');
|
|
|
|
|
$q->where(function ($sub) use ($term) {
|
|
|
|
|
$sub->where('titulo', 'like', "%{$term}%")
|
|
|
|
|
->orWhere('slug', 'like', "%{$term}%");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($request->filled('estado')) {
|
|
|
|
|
$q->where('estado', $request->string('estado'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($request->filled('publicado')) {
|
|
|
|
|
$q->where('publicado', (bool) $request->boolean('publicado'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($request->boolean('include_detalles')) {
|
|
|
|
|
$q->with(['detalles' => fn($d) => $d->orderBy('id', 'desc')]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$q->orderByDesc('id');
|
|
|
|
|
|
|
|
|
|
$perPage = (int) $request->input('per_page', 15);
|
|
|
|
|
|
|
|
|
|
return response()->json($q->paginate($perPage));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function show(Request $request, $id)
|
|
|
|
|
{
|
|
|
|
|
$q = ProcesoAdmision::query();
|
|
|
|
|
|
|
|
|
|
if ($request->boolean('include_detalles')) {
|
|
|
|
|
$q->with('detalles');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return response()->json($q->findOrFail($id));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function store(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$data = $request->validate([
|
|
|
|
|
'titulo' => ['required','string','max:255'],
|
|
|
|
|
'subtitulo' => ['nullable','string','max:255'],
|
|
|
|
|
'descripcion' => ['nullable','string'],
|
|
|
|
|
'slug' => ['nullable','string','max:120', 'unique:procesos_admision,slug'],
|
|
|
|
|
'tipo_proceso' => ['nullable','string','max:60'],
|
|
|
|
|
'modalidad' => ['nullable','string','max:50'],
|
|
|
|
|
|
|
|
|
|
'publicado' => ['sometimes','boolean'],
|
|
|
|
|
'fecha_publicacion' => ['nullable','date'],
|
|
|
|
|
|
|
|
|
|
'fecha_inicio_preinscripcion' => ['nullable','date'],
|
|
|
|
|
'fecha_fin_preinscripcion' => ['nullable','date','after_or_equal:fecha_inicio_preinscripcion'],
|
|
|
|
|
'fecha_inicio_inscripcion' => ['nullable','date'],
|
|
|
|
|
'fecha_fin_inscripcion' => ['nullable','date','after_or_equal:fecha_inicio_inscripcion'],
|
|
|
|
|
|
|
|
|
|
'fecha_examen1' => ['nullable','date'],
|
|
|
|
|
'fecha_examen2' => ['nullable','date','after_or_equal:fecha_examen1'],
|
|
|
|
|
'fecha_resultados' => ['nullable','date'],
|
|
|
|
|
|
|
|
|
|
'fecha_inicio_biometrico' => ['nullable','date'],
|
|
|
|
|
'fecha_fin_biometrico' => ['nullable','date','after_or_equal:fecha_inicio_biometrico'],
|
|
|
|
|
|
|
|
|
|
'link_preinscripcion' => ['nullable','string','max:500'],
|
|
|
|
|
'link_inscripcion' => ['nullable','string','max:500'],
|
|
|
|
|
'link_resultados' => ['nullable','string','max:500'],
|
|
|
|
|
'link_reglamento' => ['nullable','string','max:500'],
|
|
|
|
|
|
|
|
|
|
'estado' => ['sometimes', Rule::in(['nuevo','publicado','en_proceso','finalizado','cancelado'])],
|
|
|
|
|
|
|
|
|
|
'imagen' => ['nullable','image','mimes:jpg,jpeg,png,webp','max:10240'],
|
|
|
|
|
'banner' => ['nullable','image','mimes:jpg,jpeg,png,webp','max:10240'],
|
|
|
|
|
'brochure' => ['nullable','file','mimes:pdf','max:10240'],
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if (empty($data['slug'])) {
|
|
|
|
|
$data['slug'] = Str::slug($data['titulo']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$data['publicado'] = $data['publicado'] ?? false;
|
|
|
|
|
|
|
|
|
|
if ($request->hasFile('imagen')) {
|
|
|
|
|
$data['imagen_path'] = $request->file('imagen')->store('admisiones/procesos', 'public');
|
|
|
|
|
}
|
|
|
|
|
if ($request->hasFile('banner')) {
|
|
|
|
|
$data['banner_path'] = $request->file('banner')->store('admisiones/procesos', 'public');
|
|
|
|
|
}
|
|
|
|
|
if ($request->hasFile('brochure')) {
|
|
|
|
|
$data['brochure_path'] = $request->file('brochure')->store('admisiones/procesos', 'public');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$proceso = ProcesoAdmision::create($data);
|
|
|
|
|
|
|
|
|
|
return response()->json($proceso, 201);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function update(Request $request, $id)
|
|
|
|
|
{
|
|
|
|
|
$proceso = ProcesoAdmision::findOrFail($id);
|
|
|
|
|
|
|
|
|
|
$data = $request->validate([
|
|
|
|
|
'titulo' => ['sometimes','string','max:255'],
|
|
|
|
|
'subtitulo' => ['sometimes','nullable','string','max:255'],
|
|
|
|
|
'descripcion' => ['sometimes','nullable','string'],
|
|
|
|
|
'slug' => ['sometimes','nullable','string','max:120', Rule::unique('procesos_admision','slug')->ignore($proceso->id)],
|
|
|
|
|
'tipo_proceso' => ['sometimes','nullable','string','max:60'],
|
|
|
|
|
'modalidad' => ['sometimes','nullable','string','max:50'],
|
|
|
|
|
|
|
|
|
|
'publicado' => ['sometimes','boolean'],
|
|
|
|
|
'fecha_publicacion' => ['sometimes','nullable','date'],
|
|
|
|
|
|
|
|
|
|
'fecha_inicio_preinscripcion' => ['sometimes','nullable','date'],
|
|
|
|
|
'fecha_fin_preinscripcion' => ['sometimes','nullable','date','after_or_equal:fecha_inicio_preinscripcion'],
|
|
|
|
|
'fecha_inicio_inscripcion' => ['sometimes','nullable','date'],
|
|
|
|
|
'fecha_fin_inscripcion' => ['sometimes','nullable','date','after_or_equal:fecha_inicio_inscripcion'],
|
|
|
|
|
|
|
|
|
|
'fecha_examen1' => ['sometimes','nullable','date'],
|
|
|
|
|
'fecha_examen2' => ['sometimes','nullable','date','after_or_equal:fecha_examen1'],
|
|
|
|
|
'fecha_resultados' => ['sometimes','nullable','date'],
|
|
|
|
|
|
|
|
|
|
'fecha_inicio_biometrico' => ['sometimes','nullable','date'],
|
|
|
|
|
'fecha_fin_biometrico' => ['sometimes','nullable','date','after_or_equal:fecha_inicio_biometrico'],
|
|
|
|
|
|
|
|
|
|
'link_preinscripcion' => ['sometimes','nullable','string','max:500'],
|
|
|
|
|
'link_inscripcion' => ['sometimes','nullable','string','max:500'],
|
|
|
|
|
'link_resultados' => ['sometimes','nullable','string','max:500'],
|
|
|
|
|
'link_reglamento' => ['sometimes','nullable','string','max:500'],
|
|
|
|
|
|
|
|
|
|
'estado' => ['sometimes', Rule::in(['nuevo','publicado','en_proceso','finalizado','cancelado'])],
|
|
|
|
|
|
|
|
|
|
'imagen' => ['sometimes','nullable','image','mimes:jpg,jpeg,png,webp','max:10240'],
|
|
|
|
|
'banner' => ['sometimes','nullable','image','mimes:jpg,jpeg,png,webp','max:10240'],
|
|
|
|
|
'brochure' => ['sometimes','nullable','file','mimes:pdf','max:10240'],
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (array_key_exists('slug', $data) && empty($data['slug'])) {
|
|
|
|
|
$data['slug'] = Str::slug($data['titulo'] ?? $proceso->titulo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($request->hasFile('imagen')) {
|
|
|
|
|
if ($proceso->imagen_path) Storage::disk('public')->delete($proceso->imagen_path);
|
|
|
|
|
$data['imagen_path'] = $request->file('imagen')->store('admisiones/procesos', 'public');
|
|
|
|
|
}
|
|
|
|
|
if ($request->hasFile('banner')) {
|
|
|
|
|
if ($proceso->banner_path) Storage::disk('public')->delete($proceso->banner_path);
|
|
|
|
|
$data['banner_path'] = $request->file('banner')->store('admisiones/procesos', 'public');
|
|
|
|
|
}
|
|
|
|
|
if ($request->hasFile('brochure')) {
|
|
|
|
|
if ($proceso->brochure_path) Storage::disk('public')->delete($proceso->brochure_path);
|
|
|
|
|
$data['brochure_path'] = $request->file('brochure')->store('admisiones/procesos', 'public');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$proceso->update($data);
|
|
|
|
|
|
|
|
|
|
return response()->json($proceso->fresh());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function destroy($id)
|
|
|
|
|
{
|
|
|
|
|
$proceso = ProcesoAdmision::findOrFail($id);
|
|
|
|
|
|
|
|
|
|
if ($proceso->imagen_path) Storage::disk('public')->delete($proceso->imagen_path);
|
|
|
|
|
if ($proceso->banner_path) Storage::disk('public')->delete($proceso->banner_path);
|
|
|
|
|
if ($proceso->brochure_path) Storage::disk('public')->delete($proceso->brochure_path);
|
|
|
|
|
|
|
|
|
|
$proceso->delete();
|
|
|
|
|
|
|
|
|
|
return response()->json(['message' => 'Proceso eliminado']);
|
|
|
|
|
}
|
|
|
|
|
}
|