diff --git a/app/Http/Controllers/InstitucionesController.php b/app/Http/Controllers/InstitucionesController.php index 73de09cbb5e030c7bd0db09d8b62a6f177d3ba1a..851ff02edc140fca5f98461dfa14f9a9035103db 100644 --- a/app/Http/Controllers/InstitucionesController.php +++ b/app/Http/Controllers/InstitucionesController.php @@ -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,21 +69,37 @@ 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(); return redirect()->route('instituciones.get')->with('success', 'Institución guardada correctamente'); } catch (\Exception $e) { @@ -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', @@ -117,69 +145,117 @@ public function update(Request $request, string $id) } $request->replace($requestData); + + // 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(), + ]; + } + } - // Actualizar los datos principales de la institución - $institucion->update($validatedData); + // 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], + '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(); + + 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(), + ]; + } + } + } + + // Guardar auditoría de redes sociales + $redesAnteriores = $institucion->redes->toArray(); + $redes = collect($request->input('red_social_inst'))->map(function($url, $index) use ($request) { + return [ + 'link_inst' => $url, + 'red_social_inst' => $request->input('red_social_inst')[$index], + 'tipo_RS_inst' => $request->input('tipo_RS_inst')[$index], + ]; + })->toArray(); + + 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(), + ]; + } + } + } + + $data = $request->all(); - // Manejar la imagen de perfil si se sube una nueva if ($request->hasFile('imagen')) { - // Eliminar la imagen de perfil anterior si existe + // Eliminar la foto de perfil anterior si existe if ($institucion->imagen) { - Storage::delete('public/' . $institucion->imagen); + Storage::delete(STR::substr($institucion->imagen, 8)); } - - // Guardar la nueva imagen de perfil + + // Guardar la nueva foto de perfil $path_file = $this->storeProfilePicture($request); - $institucion->imagen = $path_file; - $institucion->save(); // Guardar los cambios en la institución + + if ($path_file) { + $data['imagen'] = 'storage/' . $path_file; + } else { + $data['imagen'] = 'assets/images/instituciones_icon.webp'; + } } - // 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(); + // Actualizar los datos del usuario + $institucion->update($data); - // Eliminar los teléfonos existentes y crear los nuevos - $institucion->telefonos()->delete(); - $institucion->telefonos()->createMany($telefonos); - } + // Guardar teléfonos + $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(); + // Guardar redes sociales + $institucion->redes()->delete(); + $institucion->redes()->createMany($redes); - // 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'); + 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) { diff --git a/app/Models/Instituciones.php b/app/Models/Instituciones.php index 6a48dcb5d4a15281ced6480e35cd447aac9bc930..7d97e1d95e4f930ef5bcb4647fb4fb17a9b552df 100644 --- a/app/Models/Instituciones.php +++ b/app/Models/Instituciones.php @@ -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'); diff --git a/public/assets/images/instituciones_icon.webp b/public/assets/images/instituciones_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..6bf21cf90f6161028188c149f39659e478d1ad3f Binary files /dev/null and b/public/assets/images/instituciones_icon.webp differ diff --git a/resources/views/adminGen/instituciones/edit.blade.php b/resources/views/adminGen/instituciones/edit.blade.php index 100e9e6b227e9d6f509a4a70526a25c3198f2d1d..bbac7817c11efc96e951383d726880eed6a1555f 100644 --- a/resources/views/adminGen/instituciones/edit.blade.php +++ b/resources/views/adminGen/instituciones/edit.blade.php @@ -91,9 +91,9 @@
-
- @csrf - @method('PUT') + + @csrf + @method('PUT')
@@ -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 = ` -
+
-
-
+ +
-
+