Commit 553acfb8 authored by Alfonso Rafael Solis Rangel's avatar Alfonso Rafael Solis Rangel
Browse files

Merge branch 'refactor-institucion' into 'main'

Refactor institucion

See merge request !21
parents 72bfd847 86925dc7
Loading
Loading
Loading
Loading
+198 −64
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;

class InstitucionesController extends Controller
{
@@ -29,6 +30,7 @@ public function create()
    public function store(Request $request)
    {
        // Validación de los datos del formulario
        
        $request->validate([
            'nombre' => 'required|string|max:255',
            'RFC' => 'nullable|string|max:13',
@@ -40,13 +42,24 @@ public function store(Request $request)
            'imagen' => 'nullable|file|image|max:2048',
        ]);
    
        // Depuración: inspeccionar los datos recibidos
        //\Log::info('Datos recibidos:', $data);
        $telefonosData = $request->only(['prefijo', 'lada', 'numero', 'tipo', 'estatus', 'ext', 'id_radio', 'observaciones']);
        $telefonosData = array_map(function ($item) {
            return array_map(function ($value) {
                return ($value === "null") ? null : $value;
            }, $item);
        }, $telefonosData);

        $redesSocialesData = $request->only(['red_social_inst', 'link_inst', 'tipo_RS_inst']);
        $redesSocialesData = array_map(function ($item) {
            return array_map(function ($value) {
                return ($value === "null") ? null : $value;
            }, $item);
        }, $redesSocialesData);
    
        // Procesamiento y almacenamiento de la institución
        DB::beginTransaction();
        try {
            //$path_file = $this->storeProfilePicture($request);
            $path_file = $this->storeProfilePicture($request);
            $fieldsToCheck = [
                'subgrupo_id',
            ];
@@ -56,19 +69,35 @@ public function store(Request $request)
                    unset($requestData[$field]);
                }
            }

            $request->replace($requestData);

            $data = $request->all();

            // Crear la institución con los datos recibidos

            if ($path_file) {
                $data['imagen'] = 'storage/' . $path_file;
            }else{
                $data['imagen'] = 'assets/images/instituciones_icon.webp';
            }

            $institucion = Instituciones::create($data);

            // Manejar los datos de teléfonos
            if (!empty($data['telefonos'])) {
                $this->storeTelefonos($institucion->id, $data['telefonos']);
            }
            $telefonosGuardados = $this->storeTelefonos($institucion->id, $telefonosData);

            // Manejar los datos de redes sociales
            if (!empty($data['redes_sociales'])) {
                $this->storeRedesSociales($institucion->id, $data['redes_sociales']);
            $redesSocialesGuardadas = $this->storeRedesSociales($institucion->id, $redesSocialesData);

            // Si había datos de teléfonos y no se guardaron, lanzar excepción
            if ($telefonosGuardados === false && $this->telefonoDataPresent($telefonosData)) {
                throw new \Exception('Error al guardar los teléfonos');
            }

            // Si había datos de redes sociales y no se guardaron, lanzar excepción
            if ($redesSocialesGuardadas === false && $this->redSocialDataPresent($redesSocialesData)) {
                throw new \Exception('Error al guardar las redes sociales');
            }

            DB::commit();
@@ -79,19 +108,17 @@ public function store(Request $request)
        }
    }

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

    public function edit(string $id)
    public function edit($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
        $subgrupos = Subgrupo::all();
        $redes = $instituciones->redes; 
    
        return view('adminGen.instituciones.edit', compact('instituciones', 'subgrupos', 'redes'));
    }
@@ -105,6 +132,7 @@ public function update(Request $request, string $id)
        ]);
    
        $institucion = Instituciones::findOrFail($id);
        $user = auth()->user();

        $fieldsToCheck = [
            'subgrupo_id',
@@ -118,68 +146,116 @@ public function update(Request $request, string $id)

        $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 auditoría de campos simples
        $changes = [];
        foreach ($requestData as $key => $value) {
            if (!is_array($value) && $key !== '_token' && $institucion->$key != $value) {
                $changes[] = [
                    'campo_editado' => $key,
                    'valor_anterior' => $institucion->$key,
                    'nuevo_valor' => $value,
                    'instituciones_id' => $institucion->id,
                    'user_id' => $user->id,
                    'created_at' => now(),
                    'updated_at' => now(),
                ];
            }
            
            // 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')) {
        // Guardar auditoría de teléfonos
        $telefonosAnteriores = $institucion->telefonos->toArray();
        $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,
                'lada' => $request->input('lada')[$index],
                'numero' => $request->input('numero')[$index],
                'tipo' => $request->input('tipo')[$index],
                'estatus' => $request->input('estatus')[$index],
                'ext' => $request->input('ext')[$index],
                'id_radio' => $request->input('id_radio')[$index],
                'observaciones' => $request->input('observaciones')[$index],
            ];
        })->toArray();
    
            // Eliminar los teléfonos existentes y crear los nuevos
            $institucion->telefonos()->delete();
            $institucion->telefonos()->createMany($telefonos);
        foreach ($telefonosAnteriores as $index => $telefonoAnterior) {
            foreach ($telefonoAnterior as $key => $value) {
                if (isset($telefonos[$index][$key]) && $value != $telefonos[$index][$key]) {
                    $changes[] = [
                        'campo_editado' => "telefono_{$index}_{$key}",
                        'valor_anterior' => $value,
                        'nuevo_valor' => $telefonos[$index][$key],
                        'instituciones_id' => $institucion->id,
                        'user_id' => $user->id,
                        'created_at' => now(),
                        'updated_at' => now(),
                    ];
                }
            }
        }
    
        // 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;
                
        // Guardar auditoría de redes sociales
        $redesAnteriores = $institucion->redes->toArray();
        $redes = collect($request->input('red_social_inst'))->map(function($url, $index) use ($request) {
            return [
                    'red_social_inst' => $red_social_inst,
                'link_inst' => $url,
                    'tipo_RS_inst' => $tipo_RS_inst,
                'red_social_inst' => $request->input('red_social_inst')[$index],
                'tipo_RS_inst' => $request->input('tipo_RS_inst')[$index],
            ];
        })->toArray();
    
            // Eliminar las redes sociales existentes y crear las nuevas
            $institucion->redesSocialesInst()->delete();
            $institucion->redesSocialesInst()->createMany($redes);
        foreach ($redesAnteriores as $index => $redAnterior) {
            foreach ($redAnterior as $key => $value) {
                if (isset($redes[$index][$key]) && $value != $redes[$index][$key]) {
                    $changes[] = [
                        'campo_editado' => "red_{$index}_{$key}",
                        'valor_anterior' => $value,
                        'nuevo_valor' => $redes[$index][$key],
                        'instituciones_id' => $institucion->id,
                        'user_id' => $user->id,
                        'created_at' => now(),
                        'updated_at' => now(),
                    ];
                }
            }
        }
    
        return redirect()->route('instituciones.get')->with('success', 'Institución actualizada correctamente');
        $data = $request->all();
    
        if ($request->hasFile('imagen')) {
            // Eliminar la foto de perfil anterior si existe
            if ($institucion->imagen) {
                Storage::delete(STR::substr($institucion->imagen, 8));
            }
    
            // Guardar la nueva foto de perfil
            $path_file = $this->storeProfilePicture($request);
    
            if ($path_file) {
                $data['imagen'] = 'storage/' . $path_file;
            } else {
                $data['imagen'] = 'assets/images/instituciones_icon.webp';
            }
        }
    
        // Actualizar los datos del usuario
        $institucion->update($data);
    
        // Guardar teléfonos
        $institucion->telefonos()->delete();
        $institucion->telefonos()->createMany($telefonos);
    
        // Guardar redes sociales
        $institucion->redes()->delete();
        $institucion->redes()->createMany($redes);
    
        return redirect()->route('instituciones.get', ['id' => $id])->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) {
@@ -250,6 +326,64 @@ private function storeTelefonos($institucionId, $telefonosData)
        return false;
    }

    private function telefonoDataPresent($telefonosData)
    {
        foreach ($telefonosData['numero'] as $index => $numero) {
            foreach ($telefonosData as $key => $values) {
                if (!is_null($values[$index]) && $values[$index] !== "null") {
                    return true;
                }
            }
        }

        return false;
    }

    private function storeRedesSociales($institucionesId, $redesSocialesData)
    {
        $redesSociales = [];

        foreach ($redesSocialesData['red_social_inst'] as $index => $redSocial) {
            // Verificar si todos los campos de la red social están vacíos (null o "null")
            $isEmpty = true;
            foreach ($redesSocialesData as $key => $values) {
                if (!is_null($values[$index]) && $values[$index] !== "null") {
                    $isEmpty = false;
                    break;
                }
            }

            if (!$isEmpty) {
                $redesSociales[] = [
                    'instituciones_id' => $institucionesId,
                    'red_social_inst' =>$redesSocialesData['red_social_inst'][$index],
                    'link_inst' => $redesSocialesData['link_inst'][$index],
                    'tipo_RS_inst' => $redesSocialesData['tipo_RS_inst'][$index],
                ];
            }
        }

        if (!empty($redesSociales)) {
            RedesSocialesInst::insert($redesSociales);
            return true;
        }

        return false;
    }

    private function redSocialDataPresent($redesSocialesData)
    {
        foreach ($redesSocialesData['red_social'] as $index => $redSocial) {
            foreach ($redesSocialesData as $key => $values) {
                if (!is_null($values[$index]) && $values[$index] !== "null") {
                    return true;
                }
            }
        }

        return false;
    }


    private function storeProfilePicture(Request $request)
    {
+5 −0
Original line number Diff line number Diff line
@@ -31,6 +31,11 @@ public function redesSocialesInst()
        return $this->hasMany(RedesSocialesInst::class, 'instituciones_id');
    }

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

    public function telefonos()
    {
        return $this->hasMany(TelefonoInst::class, 'instituciones_id');
+3.56 KiB
Loading image diff...
+7 −7
Original line number Diff line number Diff line
@@ -389,14 +389,14 @@
                        const newFormGroup = document.createElement('div');
                        newFormGroup.classList.add('grid', 'grid-cols-1', 'md:grid-cols-3', 'gap-5', 'form-group', 'relative');
                        newFormGroup.innerHTML = `
                                    <div>
                                    <fieldset>
                                        <label for="red_social_inst">Nombre como se encuentra en la red social:</label>
                                        <input id="red_social_inst" name="red_social_inst[]" type="text" class="form-input" />
                                    </div>
                                    <div>
                                    </fieldset>
                                    <fieldset>
                                        <label for="link_inst">URL del la red social o página web</label>
                                        <input id="link_inst" name="link_inst[]" type="text" class="form-input" />
                                    </div>
                                    </fieldset>
                                    <div>
                                        <label for="tipo_RS_inst">Tipo</label>
                                        <select id="tipo_RS_inst" name="tipo_RS_inst[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
+100 −444

File changed.

Preview size limit exceeded, changes collapsed.

Loading