Loading app/Http/Controllers/InstitucionesController.php +204 −48 Original line number Diff line number Diff line Loading @@ -6,7 +6,11 @@ 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 { Loading @@ -18,86 +22,238 @@ public function index() public function create() { $subgrupos = Subgrupo::all(); $subgrupos = Subgrupo::get(); return view('adminGen.instituciones.create', compact('subgrupos')); } public function store(Request $request) { $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', // 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', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'telefonos' => 'array', 'redesSociales' => 'array' 'imagen' => 'nullable|file|image|max:2048', ]); $institucion = Institucion::create($data); // 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); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); // Manejar los datos de teléfonos if (!empty($data['telefonos'])) { $this->storeTelefonos($institucion->id, $data['telefonos']); } foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); // Manejar los datos de redes sociales if (!empty($data['redes_sociales'])) { $this->storeRedesSociales($institucion->id, $data['redes_sociales']); } return redirect()->route('instituciones.index'); 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(Institucion $institucion) public function show(Instituciones $instituciones) { return view('instituciones.show', compact('institucion')); // } public function edit(Institucion $institucion) public function edit(string $id) { return view('instituciones.edit', compact('institucion')); $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, Institucion $institucion) public function update(Request $request, string $id) { $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', 'domicilio' => 'nullable|string', 'codigo_postal' => 'nullable|integer', 'localidad' => 'nullable|string', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'telefonos' => 'array', 'redesSociales' => 'array' // Validar los datos $validatedData = $request->validate([ 'nombre' => 'required|string|max:255', 'imagen' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', ]); $institucion->update($data); $instituciones = Instituciones::findOrFail($id); $instituciones->update($validatedData); if ($request->hasFile('imagen')) { // Eliminar la foto de perfil anterior si existe if ($instituciones->imagen) { Storage::delete('public/' . $instituciones->imagen); } // Guardar la nueva foto de perfil $path_file = $this->storeProfilePicture($request); $instituciones->imagen = $path_file; } // Actualizar los datos del usuario $instituciones->update($validatedData); // 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(); $instituciones->telefonos()->delete(); $instituciones->telefonos()->createMany($telefonos); } // Guardar redes sociales $redes = collect($request->input('link_inst'))->map(function($url, $index) use ($request) { return [ 'red_social_inst' => $request->input('red_social_inst')[$index], // Debe ser el username 'link_inst' => $url, // Debe ser la URL de la red social 'tipo_RS_inst' => $request->input('tipo_red_social')[$index], // Tipo de red social ]; }); $instituciones->redesSocialesInst()->delete(); $instituciones->redesSocialesInst()->createMany($redes->toArray()); 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(); $institucion->telefonos()->delete(); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); // 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); } $institucion->redesSociales()->delete(); foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); // Retornar null si no hay archivo return null; } return redirect()->route('instituciones.index'); 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; } } public function destroy(Institucion $institucion) 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) { $institucion->telefonos()->delete(); $institucion->redesSociales()->delete(); $institucion->delete(); 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); } return redirect()->route('instituciones.index'); // Retornar null si no hay archivo return null; } } No newline at end of file app/Models/Instituciones.php +2 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ class Instituciones extends Model 'codigo_postal', 'localidad', 'aniversario', 'observaciones', 'observaciones_inst', 'subgrupo_id' ]; Loading @@ -26,7 +26,7 @@ public function subgrupo() return $this->belongsTo(Subgrupo::class); } public function redesSociales() public function redesSocialesInst() { return $this->hasMany(RedesSocialesInst::class, 'instituciones_id'); } Loading app/Models/RedesSocialesInst.php +5 −5 Original line number Diff line number Diff line Loading @@ -10,14 +10,14 @@ class RedesSocialesInst extends Model use HasFactory; protected $fillable = [ 'nombre', 'link', 'tipo', 'instituciones_id' 'instituciones_id', 'red_social_inst', 'link_inst', 'tipo_RS_inst' ]; public function institucion() { return $this->belongsTo(Institucion::class, 'instituciones_id'); return $this->belongsTo(Instituciones::class, 'instituciones_id'); } } No newline at end of file app/Models/TelefonoInst.php +1 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,6 @@ class TelefonoInst extends Model public function institucion() { return $this->belongsTo(Institucion::class); return $this->belongsTo(Instituciones::class, 'instituciones_id'); } } database/migrations/2024_06_21_202405_create_instituciones_table.php +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ public function up(): void $table->integer('codigo_postal')->nullable(); $table->string('localidad')->nullable(); $table->date('aniversario')->nullable(); $table->string('observaciones')->nullable(); $table->string('observaciones_inst')->nullable(); $table->timestamps(); $table->unsignedBigInteger('subgrupo_id')->nullable(); Loading Loading
app/Http/Controllers/InstitucionesController.php +204 −48 Original line number Diff line number Diff line Loading @@ -6,7 +6,11 @@ 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 { Loading @@ -18,86 +22,238 @@ public function index() public function create() { $subgrupos = Subgrupo::all(); $subgrupos = Subgrupo::get(); return view('adminGen.instituciones.create', compact('subgrupos')); } public function store(Request $request) { $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', // 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', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'telefonos' => 'array', 'redesSociales' => 'array' 'imagen' => 'nullable|file|image|max:2048', ]); $institucion = Institucion::create($data); // 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); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); // Manejar los datos de teléfonos if (!empty($data['telefonos'])) { $this->storeTelefonos($institucion->id, $data['telefonos']); } foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); // Manejar los datos de redes sociales if (!empty($data['redes_sociales'])) { $this->storeRedesSociales($institucion->id, $data['redes_sociales']); } return redirect()->route('instituciones.index'); 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(Institucion $institucion) public function show(Instituciones $instituciones) { return view('instituciones.show', compact('institucion')); // } public function edit(Institucion $institucion) public function edit(string $id) { return view('instituciones.edit', compact('institucion')); $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, Institucion $institucion) public function update(Request $request, string $id) { $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', 'domicilio' => 'nullable|string', 'codigo_postal' => 'nullable|integer', 'localidad' => 'nullable|string', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'telefonos' => 'array', 'redesSociales' => 'array' // Validar los datos $validatedData = $request->validate([ 'nombre' => 'required|string|max:255', 'imagen' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', ]); $institucion->update($data); $instituciones = Instituciones::findOrFail($id); $instituciones->update($validatedData); if ($request->hasFile('imagen')) { // Eliminar la foto de perfil anterior si existe if ($instituciones->imagen) { Storage::delete('public/' . $instituciones->imagen); } // Guardar la nueva foto de perfil $path_file = $this->storeProfilePicture($request); $instituciones->imagen = $path_file; } // Actualizar los datos del usuario $instituciones->update($validatedData); // 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(); $instituciones->telefonos()->delete(); $instituciones->telefonos()->createMany($telefonos); } // Guardar redes sociales $redes = collect($request->input('link_inst'))->map(function($url, $index) use ($request) { return [ 'red_social_inst' => $request->input('red_social_inst')[$index], // Debe ser el username 'link_inst' => $url, // Debe ser la URL de la red social 'tipo_RS_inst' => $request->input('tipo_red_social')[$index], // Tipo de red social ]; }); $instituciones->redesSocialesInst()->delete(); $instituciones->redesSocialesInst()->createMany($redes->toArray()); 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(); $institucion->telefonos()->delete(); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); // 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); } $institucion->redesSociales()->delete(); foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); // Retornar null si no hay archivo return null; } return redirect()->route('instituciones.index'); 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; } } public function destroy(Institucion $institucion) 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) { $institucion->telefonos()->delete(); $institucion->redesSociales()->delete(); $institucion->delete(); 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); } return redirect()->route('instituciones.index'); // Retornar null si no hay archivo return null; } } No newline at end of file
app/Models/Instituciones.php +2 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ class Instituciones extends Model 'codigo_postal', 'localidad', 'aniversario', 'observaciones', 'observaciones_inst', 'subgrupo_id' ]; Loading @@ -26,7 +26,7 @@ public function subgrupo() return $this->belongsTo(Subgrupo::class); } public function redesSociales() public function redesSocialesInst() { return $this->hasMany(RedesSocialesInst::class, 'instituciones_id'); } Loading
app/Models/RedesSocialesInst.php +5 −5 Original line number Diff line number Diff line Loading @@ -10,14 +10,14 @@ class RedesSocialesInst extends Model use HasFactory; protected $fillable = [ 'nombre', 'link', 'tipo', 'instituciones_id' 'instituciones_id', 'red_social_inst', 'link_inst', 'tipo_RS_inst' ]; public function institucion() { return $this->belongsTo(Institucion::class, 'instituciones_id'); return $this->belongsTo(Instituciones::class, 'instituciones_id'); } } No newline at end of file
app/Models/TelefonoInst.php +1 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,6 @@ class TelefonoInst extends Model public function institucion() { return $this->belongsTo(Institucion::class); return $this->belongsTo(Instituciones::class, 'instituciones_id'); } }
database/migrations/2024_06_21_202405_create_instituciones_table.php +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ public function up(): void $table->integer('codigo_postal')->nullable(); $table->string('localidad')->nullable(); $table->date('aniversario')->nullable(); $table->string('observaciones')->nullable(); $table->string('observaciones_inst')->nullable(); $table->timestamps(); $table->unsignedBigInteger('subgrupo_id')->nullable(); Loading