Commit 2489bf5e authored by Alfonso Rafael Solis Rangel's avatar Alfonso Rafael Solis Rangel
Browse files

Merge branch 'contactos' into 'main'

Contactos

See merge request !19
parents fc358793 c54dd37c
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
<?php

namespace App\Http\Controllers;

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

class AuditoriaController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(Auditoria $auditoria)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(Auditoria $auditoria)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, Auditoria $auditoria)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Auditoria $auditoria)
    {
        //
    }
}
+301 −10
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace App\Http\Controllers;

use App\Models\Auditoria;
use App\Models\Caracteristicas;
use App\Models\cargos;
use App\Models\Contacto;
@@ -14,6 +15,8 @@
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;

class ContactoController extends Controller
{
@@ -22,7 +25,7 @@ class ContactoController extends Controller
     */
    public function index()
    {
        $contactos = Contacto::get();
        $contactos = Contacto::with('profesion', 'cargo')->get();
        return view('adminGen.contactos.index', compact('contactos'));
    }

@@ -68,7 +71,7 @@ public function store(Request $request)
        $correosData = $request->only(['correo_electronico', 'tipo_correo_electronico']);
        $correosData = array_map(function ($item) {
            return array_map(function ($value) {
                return ($value === '0' || $value === "null") ? null : $value;
                return ($value === "null") ? null : $value;
            }, $item);
        }, $correosData);

@@ -140,33 +143,216 @@ public function store(Request $request)
    /**
     * Display the specified resource.
     */
    public function show(Contacto $contacto)
    public function show(string $id)
    {
        //
        $contacto = Contacto::with('profesion', 'cargo', 'pareja')->findOrFail($id);
        return view('adminGen.contactos.show', compact('contacto'));
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(Contacto $contacto)
    public function edit(string $id)
    {
        //
        $conyuges = Contacto::where('id', '!=' ,$id)->get();
        $profesiones = Profesion::get();
        $cargos = cargos::get();
        $caracteristicas = Caracteristicas::get();
        $subgrupos = Subgrupo::get();
        $contacto = Contacto::with(['telefonos', 'redes', 'correos'])->findOrFail($id);
        //dd($contacto);
        return view('adminGen.contactos.edit', compact('contacto', 'conyuges', 'profesiones', 'cargos', 'caracteristicas', 'subgrupos'));
    }

    /**
     * Update the specified resource in storage.
     * TODO: Falta terminar de hacer pruebas a la funcionalidad de auditoria
     */
    public function update(Request $request, Contacto $contacto)
    public function update(Request $request, string $id)
    {
        //
        // Validar los datos
        $validatedData = $request->validate([
            'nombre' => 'required|string|max:255',
            'foto_perfil' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        ]);
    
        $contacto = Contacto::findOrFail($id);
        $user = auth()->user();
    
        $fieldsToCheck = [
            'conyuge_id',
            'profesion_id',
            'cargo_id',
            'caracteristica_id',
            'subgrupo_id',
            'mes_cump',
            'dia_cump',
            //institucion_id
        ];
        $requestData = $request->all();
        foreach ($fieldsToCheck as $field) {
            if (isset($requestData[$field]) && $requestData[$field] === "null") {
                unset($requestData[$field]);
            }
        }
    
        $request->replace($requestData);
    
        // Guardar auditoría de campos simples
        $changes = [];
        foreach ($requestData as $key => $value) {
            if (!is_array($value) && $key !== '_token' && $contacto->$key != $value) {
                $changes[] = [
                    'campo_editado' => $key,
                    'valor_anterior' => $contacto->$key,
                    'nuevo_valor' => $value,
                    'contacto_id' => $contacto->id,
                    'user_id' => $user->id,
                    'created_at' => now(),
                    'updated_at' => now(),
                ];
            }
        }
    
        // Guardar auditoría de teléfonos
        $telefonosAnteriores = $contacto->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],
                        'contacto_id' => $contacto->id,
                        'user_id' => $user->id,
                        'created_at' => now(),
                        'updated_at' => now(),
                    ];
                }
            }
        }
    
        // Guardar auditoría de redes sociales
        $redesAnteriores = $contacto->redes->toArray();
        $redes = collect($request->input('red_social'))->map(function($url, $index) use ($request) {
            return [
                'red_social' => $url,
                'tipo_red_social' => $request->input('tipo_red_social')[$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],
                        'contacto_id' => $contacto->id,
                        'user_id' => $user->id,
                        'created_at' => now(),
                        'updated_at' => now(),
                    ];
                }
            }
        }
    
        // Guardar auditoría de correos
        $correosAnteriores = $contacto->correos->toArray();
        $correos = collect($request->input('correo_electronico'))->map(function($email, $index) use ($request) {
            return [
                'correo_electronico' => $email,
                'tipo_correo_electronico' => $request->input('tipo_correo_electronico')[$index],
            ];
        })->toArray();
    
        foreach ($correosAnteriores as $index => $correoAnterior) {
            foreach ($correoAnterior as $key => $value) {
                if (isset($correos[$index][$key]) && $value != $correos[$index][$key]) {
                    $changes[] = [
                        'campo_editado' => "correo_{$index}_{$key}",
                        'valor_anterior' => $value,
                        'nuevo_valor' => $correos[$index][$key],
                        'contacto_id' => $contacto->id,
                        'user_id' => $user->id,
                        'created_at' => now(),
                        'updated_at' => now(),
                    ];
                }
            }
        }
    
        if (!empty($changes)) {
            Auditoria::insert($changes);
        }
    
        // Actualizar los datos del contacto
        $contacto->conyuge_id = $request->input('conyuge_id') !== 'null' ? $request->input('conyuge_id') : null;
        $contacto->profesion_id = $request->input('profesion_id') !== 'null' ? $request->input('profesion_id') : null;
        $contacto->cargo_id = $request->input('cargo_id') !== 'null' ? $request->input('cargo_id') : null;
        $contacto->cargo_desc = $request->input('cargo_desc');
    
        $data = $request->all();
    
        if ($request->hasFile('foto_perfil')) {
            // Eliminar la foto de perfil anterior si existe
            if ($contacto->foto_perfil) {
                Storage::delete(STR::substr($contacto->foto_perfil, 8));
            }
    
            // Guardar la nueva foto de perfil
            $path_file = $this->storeProfilePicture($request);
    
            if ($path_file) {
                $data['foto_perfil'] = 'storage/' . $path_file;
            } else {
                $data['foto_perfil'] = 'assets/images/profile-icon.webp';
            }
        }
    
        // Actualizar los datos del usuario
        $contacto->update($data);
    
        // Guardar teléfonos
        $contacto->telefonos()->delete();
        $contacto->telefonos()->createMany($telefonos);
    
        // Guardar redes sociales
        $contacto->redes()->delete();
        $contacto->redes()->createMany($redes);
    
        // Guardar correos electrónicos
        $contacto->correos()->delete();
        $contacto->correos()->createMany($correos);
    
        return redirect()->route('contacto.get')->with('success', 'Contacto actualizado correctamente');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Contacto $contacto)
    public function destroy(string $id)
    {
        //
        try{
            $contacto = Contacto::findOrFail($id);
            $contacto->delete();
            return redirect()->route('contacto.get')->with('success', 'Contacto eliminado correctamente.');
        }catch(\Exception $e){
            return redirect()->route('contacto.get')->withErrors('Error al eliminar el contacto.');
        }
    }

    /**
@@ -335,4 +521,109 @@ private function correoDataPresent($correosData)

        return false;
    }

    public function viewUpload()
    {
        return view('adminGen.contactos.upload');
    }

    public function upload(Request $request)
    {
        $request->validate([
            'csv_file' => 'required|mimes:csv,txt',
        ]);

        $path = $request->file('csv_file')->getRealPath();
        $content = file_get_contents($path);
        $content = str_replace("\xEF\xBB\xBF", '', $content); 

        $data = array_map('str_getcsv', explode("\n", $content));
        $header = array_shift($data);

        foreach ($data as $row) {
            if (count($header) !== count($row)) {
                continue;
            }
            $row = array_combine($header, $row);

            $contacto = Contacto::create([
                'nombre' => $row['nombre'],
                'ap_paterno' => $row['ap_paterno'],
                'ap_materno' => $row['ap_materno'],
                'cargo_desc' => $row['cargo_desc'],
                'mes_cump' => $row['mes_cump'],
                'dia_cump' => $row['dia_cump'],
                'domicilio_oficial' => $row['domicilio_oficial'],
                'codigo_postal' => $row['codigo_postal'],
                'localidad_oficial' => $row['localidad_oficial'],
                'municipio_oficial' => $row['municipio_oficial'],
                'estado' => $row['estado'],
                'pais' => $row['pais'],
                'domicilio_par' => $row['domicilio_par'],
                'codigo_postal_par' => $row['codigo_postal_par'],
                'localidad_par' => $row['localidad_par'],
                'municipio_par' => $row['municipio_par'],
                'estado_par' => $row['estado_par'],	
                'pais_par' => $row['pais_par'],	
                'finado' => $row['finado'],
                'foto_perfil' => 'assets/images/profile-icon.webp'
            ]);

            // Procesar teléfonos
            $prefijos = explode(';', $row['prefijo']);
            $ladas = explode(';', $row['lada']);
            $numeros = explode(';', $row['numero']);
            $tipos = explode(';', $row['tipo']);
            $estatuses = explode(';', $row['estatus']);
            $exts = explode(';', $row['ext']);
            $id_radios = explode(';', $row['id_radio']);
            $observaciones = explode(';', $row['observaciones']);

            for ($i = 0; $i < count($prefijos); $i++) {
                if ($prefijos[$i] != 'null' || $ladas[$i] != 'null' || $numeros[$i] != 'null') {
                    Telefono::create([
                        'contacto_id' => $contacto->id,
                        'prefijo' => $prefijos[$i],
                        'lada' => $ladas[$i],
                        'numero' => $numeros[$i],
                        'tipo' => $tipos[$i],
                        'estatus' => $estatuses[$i],
                        'ext' => $exts[$i],
                        'id_radio' => $id_radios[$i],
                        'observaciones' => $observaciones[$i],
                    ]);
                }
            }

            // Procesar redes sociales
            $redes_sociales = explode(';', $row['red_social']);
            $tipos_redes_sociales = explode(';', $row['tipo_red_social']);

            for ($i = 0; $i < count($redes_sociales); $i++) {
                if ($redes_sociales[$i] != 'null' || $tipos_redes_sociales[$i] != 'null') {
                    RedesSociales::create([
                        'contacto_id' => $contacto->id,
                        'red_social' => $redes_sociales[$i],
                        'tipo_red_social' => $tipos_redes_sociales[$i],
                    ]);
                }
            }

            // Procesar correos electrónicos
            $correos = explode(';', $row['correo_electronico']);
            $tipos_correos = explode(';', $row['tipo_correo_electronico']);

            for ($i = 0; $i < count($correos); $i++) {
                if ($correos[$i] != 'null' || $tipos_correos[$i] != 'null') {
                    CorreoContactos::create([
                        'contacto_id' => $contacto->id,
                        'correo_electronico' => $correos[$i],
                        'tipo_correo_electronico' => $tipos_correos[$i],
                    ]);
                }
            }
        }

        return redirect()->route('contacto.get')->with('success', 'Importación de contactos almacenada correctamente');
    }
}
+29 −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 Auditoria extends Model
{
    use HasFactory;

    protected $fillable = [
        'campo_editado',
        'valor_anterior',
        'nuevo_valor',
        'contacto_id',
        'user_id',
    ];

    public function contacto()
    {
        return $this->belongsTo(Contacto::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
+31 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

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

class Contacto extends Model
{
@@ -39,4 +40,34 @@ class Contacto extends Model
        //'institucion_id',
        'subgrupo_id',
    ];

    public function profesion(): BelongsTo
    {
        return $this->belongsTo(Profesion::class);
    }

    public function pareja(): BelongsTo
    {
        return $this->belongsTo(Contacto::class, 'conyuge_id');
    }

    public function cargo(): BelongsTo
    {
        return $this->belongsTo(cargos::class);
    }

    public function telefonos()
    {
        return $this->hasMany(Telefono::class);
    }

    public function redes()
    {
        return $this->hasMany(RedesSociales::class);
    }

    public function correos()
    {
        return $this->hasMany(CorreoContactos::class);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
        "This file is @generated automatically"
    ],
    "content-hash": "ad53994e33fc40bc932315ca31084ff3",
    "content-hash": "7b28faeac6b57475b878b6147632b657",
    "packages": [
        {
            "name": "bacon/bacon-qr-code",
Loading