Loading app/Http/Controllers/InstitucionesController.php +198 −64 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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', Loading @@ -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', ]; Loading @@ -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(); Loading @@ -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')); } Loading @@ -105,6 +132,7 @@ public function update(Request $request, string $id) ]); $institucion = Instituciones::findOrFail($id); $user = auth()->user(); $fieldsToCheck = [ 'subgrupo_id', Loading @@ -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) { Loading Loading @@ -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) { Loading app/Models/Instituciones.php +5 −0 Original line number Diff line number Diff line Loading @@ -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'); Loading public/assets/images/instituciones_icon.webp 0 → 100644 +3.56 KiB Loading image diff... resources/views/adminGen/instituciones/edit.blade.php +7 −7 Original line number Diff line number Diff line Loading @@ -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"> Loading resources/views/adminGen/instituciones/show.blade.php +100 −444 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
app/Http/Controllers/InstitucionesController.php +198 −64 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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', Loading @@ -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', ]; Loading @@ -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(); Loading @@ -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')); } Loading @@ -105,6 +132,7 @@ public function update(Request $request, string $id) ]); $institucion = Instituciones::findOrFail($id); $user = auth()->user(); $fieldsToCheck = [ 'subgrupo_id', Loading @@ -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) { Loading Loading @@ -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) { Loading
app/Models/Instituciones.php +5 −0 Original line number Diff line number Diff line Loading @@ -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'); Loading
resources/views/adminGen/instituciones/edit.blade.php +7 −7 Original line number Diff line number Diff line Loading @@ -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"> Loading
resources/views/adminGen/instituciones/show.blade.php +100 −444 File changed.Preview size limit exceeded, changes collapsed. Show changes