Commit 72bfd847 authored by Alfonso Rafael Solis Rangel's avatar Alfonso Rafael Solis Rangel
Browse files

Merge branch 'instituciones' into 'main'

Instituciones

See merge request !20
parents 2489bf5e b38f88a0
Loading
Loading
Loading
Loading
+279 −0
Original line number Diff line number Diff line
<?php

namespace App\Http\Controllers;

use App\Models\Instituciones;
use App\Models\TelefonoInst;
use App\Models\RedesSocialesInst;
use App\Models\Subgrupo;

use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;

class InstitucionesController extends Controller
{
    public function index()
    {
        $instituciones = Instituciones::all();
        return view('adminGen.instituciones.index', compact('instituciones'));
    }

    public function create()
    {
        $subgrupos = Subgrupo::get();
        return view('adminGen.instituciones.create', compact('subgrupos'));
    }

    public function store(Request $request)
    {
        // Validación de los datos del formulario
        $request->validate([
            'nombre' => 'required|string|max:255',
            'RFC' => 'nullable|string|max:13',
            'aniversario' => 'nullable|date',
            'observaciones_inst' => 'nullable|string',
            'domicilio' => 'nullable|string',
            'codigo_postal' => 'nullable|integer',
            'localidad' => 'nullable|string',
            'imagen' => 'nullable|file|image|max:2048',
        ]);
    
        // Depuración: inspeccionar los datos recibidos
        //\Log::info('Datos recibidos:', $data);
    
        // Procesamiento y almacenamiento de la institución
        DB::beginTransaction();
        try {
            //$path_file = $this->storeProfilePicture($request);
            $fieldsToCheck = [
                'subgrupo_id',
            ];
            $requestData = $request->all();
            foreach ($fieldsToCheck as $field) {
                if (isset($requestData[$field]) && $requestData[$field] === "null") {
                    unset($requestData[$field]);
                }
            }
            $request->replace($requestData);
            $data = $request->all();
            // Crear la institución con los datos recibidos
            $institucion = Instituciones::create($data);
    
            // Manejar los datos de teléfonos
            if (!empty($data['telefonos'])) {
                $this->storeTelefonos($institucion->id, $data['telefonos']);
            }
    
            // Manejar los datos de redes sociales
            if (!empty($data['redes_sociales'])) {
                $this->storeRedesSociales($institucion->id, $data['redes_sociales']);
            }
    
            DB::commit();
            return redirect()->route('instituciones.get')->with('success', 'Institución guardada correctamente');
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->route('instituciones.create')->withErrors('Hubo un problema al crear la institución: ' . $e->getMessage());
        }
    }

    public function show(string $id)
    {
        return view('adminGen.instituciones.show', compact('instituciones'));
    }

    public function edit(string $id)
    {
        $subgrupos = Subgrupo::all();
        $instituciones = Instituciones::findOrFail($id);
        $instituciones->load('redesSocialesInst'); // Cargar relaciones si son necesarias
    
        // Puedes acceder a las redes sociales cargadas así:
        $redes = $instituciones->redesSocialesInst; // Esto te dará una colección de redes sociales
    
        return view('adminGen.instituciones.edit', compact('instituciones', 'subgrupos', 'redes'));
    }

    public function update(Request $request, string $id)
    {
        // Validar los datos
        $validatedData = $request->validate([
            'nombre' => 'required|string|max:255',
            'imagen' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        ]);
    
        $institucion = Instituciones::findOrFail($id);

        $fieldsToCheck = [
            'subgrupo_id',
        ];
        $requestData = $request->all();
        foreach ($fieldsToCheck as $field) {
            if (isset($requestData[$field]) && $requestData[$field] === "null") {
                unset($requestData[$field]);
            }
        }

        $request->replace($requestData);
    
        // Actualizar los datos principales de la institución
        $institucion->update($validatedData);
    
        // Manejar la imagen de perfil si se sube una nueva
        if ($request->hasFile('imagen')) {
            // Eliminar la imagen de perfil anterior si existe
            if ($institucion->imagen) {
                Storage::delete('public/' . $institucion->imagen);
            }
            
            // Guardar la nueva imagen de perfil
            $path_file = $this->storeProfilePicture($request);
            $institucion->imagen = $path_file;
            $institucion->save(); // Guardar los cambios en la institución
        }
    
        // Manejar los teléfonos
        if ($request->has('prefijo')) {
            $telefonos = collect($request->input('prefijo'))->map(function($prefijo, $index) use ($request) {
                return [
                    'prefijo' => $prefijo,
                    'lada' => $request->input('lada')[$index] ?? null,
                    'numero' => $request->input('numero')[$index] ?? null,
                    'tipo' => $request->input('tipo')[$index] ?? null,
                    'estatus' => $request->input('estatus')[$index] ?? null,
                    'ext' => $request->input('ext')[$index] ?? null,
                    'id_radio' => $request->input('id_radio')[$index] ?? null,
                    'observaciones' => $request->input('observaciones')[$index] ?? null,
                ];
            })->toArray();
    
            // Eliminar los teléfonos existentes y crear los nuevos
            $institucion->telefonos()->delete();
            $institucion->telefonos()->createMany($telefonos);
        }
    
        // Manejar las redes sociales
        if ($request->has('link_inst')) {
            $redes = collect($request->input('link_inst'))->map(function($url, $index) use ($request) {
                $red_social_inst = $request->input('red_social_inst')[$index] ?? null;
                $tipo_RS_inst = $request->input('tipo_red_social')[$index] ?? null;
                
                return [
                    'red_social_inst' => $red_social_inst,
                    'link_inst' => $url,
                    'tipo_RS_inst' => $tipo_RS_inst,
                ];
            })->toArray();
    
            // Eliminar las redes sociales existentes y crear las nuevas
            $institucion->redesSocialesInst()->delete();
            $institucion->redesSocialesInst()->createMany($redes);
        }

        return redirect()->route('instituciones.get')->with('success', 'Institución actualizada correctamente');
    }
    
    public function destroy(string $id)
    {
        try {
            $instituciones = Instituciones::findOrFail($id);
            $instituciones->redesSocialesInst()->delete(); // Cambio aquí
            $instituciones->delete();
            return redirect()->route('instituciones.get')->with('success', 'Institución eliminada correctamente.');
        } catch(\Exception $e) {
            return redirect()->route('instituciones.get')->withErrors('Error al eliminar la institución.');
        }
    }

    private function storeInstPicture(Request $request)
    {
        if ($request->hasFile('imagen')) {
            // Obtener el archivo de la solicitud
            $file = $request->file('imagen');

            // Generar un UUID de versión 4
            $uuid = Str::uuid()->toString();

            // Obtener la extensión del archivo
            $extension = $file->getClientOriginalExtension();

            // Crear el nuevo nombre de archivo
            $filename = $uuid . '.' . $extension;

            // Almacenar el archivo en el directorio storage/app/public/fotos_perfil
            $path = $file->storeAs('public/imagen', $filename);

            // Retornar la ruta del archivo sin el prefijo 'public/'
            return str_replace('public/', '', $path);
        }

        // Retornar null si no hay archivo
        return null;
    }

    private function storeTelefonos($institucionId, $telefonosData)
    {
        $telefonos = [];

        foreach ($telefonosData['numero'] as $index => $numero) {
            // Verificar si todos los campos del teléfono están vacíos (null o "null")
            $isEmpty = true;
            foreach ($telefonosData as $key => $values) {
                if (!is_null($values[$index]) && $values[$index] !== "null") {
                    $isEmpty = false;
                    break;
                }
            }

            if (!$isEmpty) {
                $telefonos[] = [
                    'instituciones_id' => $institucionId,
                    'prefijo' => $telefonosData['prefijo'][$index],
                    'lada' => $telefonosData['lada'][$index],
                    'numero' => $numero,
                    'tipo' => $telefonosData['tipo'][$index],
                    'estatus' => $telefonosData['estatus'][$index],
                    'ext' => $telefonosData['ext'][$index],
                    'id_radio' => $telefonosData['id_radio'][$index],
                    'observaciones' => $telefonosData['observaciones'][$index],
                ];
            }
        }

        if (!empty($telefonos)) {
            TelefonoInst::insert($telefonos);
            return true;
        }

        return false;
    }


    private function storeProfilePicture(Request $request)
    {
        if ($request->hasFile('imagen')) {
            // Obtener el archivo de la solicitud
            $file = $request->file('imagen');

            // Generar un UUID de versión 4
            $uuid = Str::uuid()->toString();

            // Obtener la extensión del archivo
            $extension = $file->getClientOriginalExtension();

            // Crear el nuevo nombre de archivo
            $filename = $uuid . '.' . $extension;

            // Almacenar el archivo en el directorio storage/app/public/imagen
            $path = $file->storeAs('public/imagen', $filename);

            // Retornar la ruta del archivo sin el prefijo 'public/'
            return str_replace('public/', '', $path);
        }

        // Retornar null si no hay archivo
        return null;
    }
}
 No newline at end of file
+75 −0
Original line number Diff line number Diff line
<?php

namespace App\Http\Controllers;

use App\Models\RedSocialInst;
use App\Models\Instituciones;
use Illuminate\Http\Request;

class RedSocialInstController extends Controller
{
    public function index()
    {
        $redesSociales = RedSocialInst::with('institucion')->get();
        return view('redes_sociales.index', compact('redesSociales'));
    }

    public function create()
    {
        $instituciones = Institucion::all();
        return view('redes_sociales.create', compact('instituciones'));
    }


    public function store(Request $request)
    {
        $data = $request->all();

        $redSocial = new RedSocialInst([
            'nombre' => $request->nombre,
            'link' => $request->link,
            'tipo' => $request->tipo,
            'instituciones_id' => $request->instituciones_id
        ]);

        $redSocial->save();

        return redirect()->route('instituciones.create')->with('success', 'Red social creada exitosamente.');
    }

    public function show($id)
    {
        $institucion = Institucion::findOrFail($id);
        $redesSociales = $institucion->redesSociales;
    
        return view('instituciones.show', compact('institucion', 'redesSociales'));
    }
    

    public function edit(RedSocialInst $redSocial)
    {
        $instituciones = Institucion::all();
        return view('redes_sociales.edit', compact('redSocial', 'instituciones'));
    }

    public function update(Request $request, RedSocialInst $redSocial)
    {
        $request->validate([
            'nombre' => 'required|string|max:255',
            'link' => 'required|url|max:255',
            'tipo' => 'required|string|max:255',
            'instituciones_id' => 'nullable|exists:instituciones,id'
        ]);

        $redSocial->update($request->all());

        return redirect()->route('redes_sociales.index')->with('success', 'Red social actualizada exitosamente.');
    }

    public function destroy(RedSocialInst $redSocial)
    {
        $redSocial->delete();

        return redirect()->route('redes_sociales.index')->with('success', 'Red social eliminada exitosamente.');
    }
}
+29 −0
Original line number Diff line number Diff line
<?php

namespace App\Http\Controllers;

use App\Models\TelefonoInst;
use Illuminate\Http\Request;

class TelefonoInstController extends Controller
{
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'prefijo' => 'required|integer',
            'lada' => 'required|integer',
            'numero' => 'required|integer',
            'tipo' => 'required|string|max:255',
            'estatus' => 'required|boolean',
            'ext' => 'nullable|integer',
            'observaciones' => 'nullable|string|max:255',
            'ID_radio' => 'nullable|string|max:255',
            'instituciones_id' => 'required|exists:instituciones,id'
        ]);

        TelefonoInst::create($validatedData);

        return redirect()->back()->with('success', 'Teléfono creado con éxito');
    }
}
+38 −0
Original line number Diff line number Diff line
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Instituciones extends Model
{
    use HasFactory;

    protected $fillable = [
        'imagen', 
        'nombre', 
        'RFC', 
        'domicilio', 
        'codigo_postal', 
        'localidad', 
        'aniversario', 
        'observaciones_inst', 
        'subgrupo_id'
    ];

    public function subgrupo()
    {
        return $this->belongsTo(Subgrupo::class);
    }

    public function redesSocialesInst()
    {
        return $this->hasMany(RedesSocialesInst::class, 'instituciones_id');
    }

    public function telefonos()
    {
        return $this->hasMany(TelefonoInst::class, 'instituciones_id');
    }
}
+23 −0
Original line number Diff line number Diff line
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class RedesSocialesInst extends Model
{
    use HasFactory;

    protected $fillable = [
        'instituciones_id',
        'red_social_inst',
        'link_inst', 
        'tipo_RS_inst'
    ];

    public function institucion()
    {
        return $this->belongsTo(Instituciones::class, 'instituciones_id');
    }
}
 No newline at end of file
Loading