Commit 73fd9968 authored by Alfonso Rafael Solis Rangel's avatar Alfonso Rafael Solis Rangel
Browse files

Merge branch 'exportar-datos' into 'main'

Exportar datos

See merge request !29
parents 0312644d 37e593a6
Loading
Loading
Loading
Loading
+161 −0
Original line number Diff line number Diff line
<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use App\Models\Contacto;

class ContactosExport implements FromCollection, WithHeadings
{
    protected $contactIds;
    protected $extraFields;
    protected $filters;

    public function __construct($contactIds, $extraFields = [], $filters = [])
    {
        $this->contactIds = $contactIds;
        $this->extraFields = $extraFields;
        $this->filters = $filters;
    }

    public function collection()
    {
        $query = Contacto::query();
        if (!empty($this->contactIds)) {
            $query->whereIn('contactos.id', $this->contactIds);
        }

        // Aplicar filtros adicionales usando relaciones
        $this->applyFilters($query);

        // Cargar relaciones necesarias
        $contactos = $query->with([
            'profesion',
            'cargo',
            'caracteristicas',
            'telefonos',
            'pareja',
            'correos'
        ])->get();

        // Mapear los datos a un formato exportable
        return $contactos->map(function ($contacto) {
            return $this->formatContactoData($contacto);
        });
    }

    public function headings(): array
    {
        $defaultHeadings = ['Profesión', 'Nombre', 'Apellido Paterno', 'Apellido Materno', 'Cargo'];
        $extraHeadings = $this->getExtraHeadings();
        return array_merge($defaultHeadings, $extraHeadings);
    }

    private function applyFilters($query)
    {
        if (!empty($this->filters['listas'])) {
            $query->orWhereHas('listas', function ($q) {
                $q->whereIn('listas.id', $this->filters['listas']);
            });
        }

        if (!empty($this->filters['caracteristicas'])) {
            $query->orWhereHas('caracteristicas', function ($q) {
                $q->whereIn('caracteristicas.id', $this->filters['caracteristicas']);
            });
        }

        if (!empty($this->filters['grupos'])) {
            $query->orWhereHas('grupos', function ($q) {
                $q->whereIn('grupos.id', $this->filters['grupos']);
            });
        }

        if (!empty($this->filters['cargos'])) {
            $query->orWhereHas('cargo', function ($q) {
                $q->whereIn('cargos.id', $this->filters['cargos']);
            });
        }
    }

    private function formatContactoData($contacto)
    {
        $defaultData = [
            'Profesión' => $contacto->profesion->abreviatura ?? 'N/A',
            'Nombre' => $contacto->nombre,
            'Apellido Paterno' => $contacto->ap_paterno,
            'Apellido Materno' => $contacto->ap_materno ?? '',
            'Cargo' => $contacto->cargo->nombre ?? 'N/A',
        ];

        $extraData = [];
        foreach ($this->extraFields as $field) {
            switch ($field) {
                case 'domicilio':
                    $extraData = array_merge($extraData, [
                        'Domicilio Oficial' => $contacto->domicilio_oficial ?? 'N/A',
                        'Código Postal' => $contacto->codigo_postal ?? 'N/A',
                        'Localidad Oficial' => $contacto->localidad_oficial ?? 'N/A',
                        'Municipio Oficial' => $contacto->municipio_oficial ?? 'N/A',
                        'Estado' => $contacto->estado ?? 'N/A',
                        'País' => $contacto->pais ?? 'N/A',
                    ]);
                    break;
                case 'cumpleanos':
                    $extraData['Cumpleaños'] = $contacto->mes_cump && $contacto->dia_cump
                        ? $contacto->mes_cump . '/' . $contacto->dia_cump
                        : 'N/A';
                    break;
                case 'telefonos':
                    $extraData = array_merge($extraData, [
                        'Número de teléfono' => $contacto->telefonos->pluck('numero')->join(', ') ?? 'N/A',
                        'Tipo' => $contacto->telefonos->pluck('tipo')->join(', ') ?? 'N/A',
                        'Estatus' => $contacto->telefonos->pluck('estatus')->join(', ') ?? 'N/A',
                        'Extensión' => $contacto->telefonos->pluck('ext')->join(', ') ?? 'N/A',
                        'ID Radio' => $contacto->telefonos->pluck('id_radio')->join(', ') ?? 'N/A',
                        'Observaciones' => $contacto->telefonos->pluck('observaciones')->join(', ') ?? 'N/A',
                    ]);
                    break;
                case 'conyuge':
                    $extraData['Cónyuge'] = $contacto->pareja
                        ? $contacto->pareja->nombre . ' ' . $contacto->pareja->ap_paterno . ' ' . $contacto->pareja->ap_materno
                        : 'N/A';
                    break;
                case 'email':
                    $extraData = array_merge($extraData, [
                        'Correo Electrónico' => $contacto->correos->pluck('correo_electronico')->join(', ') ?? 'N/A',
                        'Tipo de Correo Electrónico' => $contacto->correos->pluck('tipo_correo_electronico')->join(', ') ?? 'N/A',
                    ]);
                    break;
            }
        }

        return array_merge($defaultData, $extraData);
    }

    private function getExtraHeadings()
    {
        $headings = [];
        foreach ($this->extraFields as $field) {
            switch ($field) {
                case 'domicilio':
                    $headings = array_merge($headings, ['Domicilio Oficial', 'Código Postal', 'Localidad Oficial', 'Municipio Oficial', 'Estado', 'País']);
                    break;
                case 'cumpleanos':
                    $headings[] = 'Cumpleaños';
                    break;
                case 'telefonos':
                    $headings = array_merge($headings, ['Número de teléfono', 'Tipo', 'Estatus', 'Extensión', 'ID Radio', 'Observaciones']);
                    break;
                case 'conyuge':
                    $headings[] = 'Cónyuge';
                    break;
                case 'email':
                    $headings = array_merge($headings, ['Correo Electrónico', 'Tipo de Correo Electrónico']);
                    break;
            }
        }
        return $headings;
    }
}
 No newline at end of file
+98 −115
Original line number Diff line number Diff line
@@ -3,7 +3,6 @@
namespace App\Http\Controllers;

use App\Models\Auditoria;
use App\Models\Caracteristicas;
use App\Models\cargos;
use App\Models\Contacto;
use App\Models\CorreoContactos;
@@ -36,15 +35,12 @@ public function index()
     */
    public function create()
    {
        //TODO Instituciones pendientes
        $conyuges = Contacto::get();
        $profesiones = Profesion::get();
        $cargos = cargos::get();
        $caracteristicas = Caracteristicas::get();
        $subgrupos = Subgrupo::get();
        $grupos = Grupos::get();
        $instituciones = Instituciones::get();
        return view('adminGen.contactos.create', compact('conyuges', 'profesiones', 'cargos', 'caracteristicas', 'subgrupos', 'grupos', 'instituciones'));
        return view('adminGen.contactos.create', compact('conyuges', 'profesiones', 'cargos', 'subgrupos', 'grupos'));
    }

    /**
@@ -58,7 +54,7 @@ public function store(Request $request)
            'ap_paterno' => 'required|max:255|string',
        ]);

        $telefonosData = $request->only(['numero', 'tipo', 'estatus', 'ext', 'id_radio', 'observaciones']);
        $telefonosData = $request->only(['numero', 'tipo', 'estatus', 'ext', 'observaciones']);
        $telefonosData = array_map(function ($item) {
            return array_map(function ($value) {
                return ($value === "null") ? null : $value;
@@ -88,10 +84,8 @@ public function store(Request $request)
                'conyuge_id',
                'profesion_id',
                'cargo_id',
                'caracteristica_id',
                'mes_cump',
                'dia_cump',
                'institucion_id'
            ];
            $requestData = $request->all();
            foreach ($fieldsToCheck as $field) {
@@ -169,12 +163,10 @@ public function edit(string $id)
        $conyuges = Contacto::where('id', '!=' ,$id)->get();
        $profesiones = Profesion::get();
        $cargos = cargos::get();
        $caracteristicas = Caracteristicas::get();
        $subgrupos = Subgrupo::get();
        $grupos = Grupos::get();
        $instituciones = Instituciones::get();
        $contacto = Contacto::with(['telefonos', 'redes', 'correos', 'grupos', 'subgrupos'])->findOrFail($id);
        return view('adminGen.contactos.edit', compact('contacto', 'conyuges', 'profesiones', 'cargos', 'caracteristicas', 'subgrupos', 'grupos', 'instituciones'));
        return view('adminGen.contactos.edit', compact('contacto', 'conyuges', 'profesiones', 'cargos', 'subgrupos', 'grupos'));
    }

    /**
@@ -196,11 +188,9 @@ public function update(Request $request, string $id)
            'conyuge_id',
            'profesion_id',
            'cargo_id',
            'caracteristica_id',
            'subgrupo_id',
            'mes_cump',
            'dia_cump',
            'institucion_id'
        ];
        $requestData = $request->all();
        foreach ($fieldsToCheck as $field) {
@@ -235,7 +225,6 @@ public function update(Request $request, string $id)
                '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],
            ];
        });
@@ -440,7 +429,6 @@ private function storeTelefonos($contactoId, $telefonosData)
                    'tipo' => $telefonosData['tipo'][$index],
                    'estatus' => $telefonosData['estatus'][$index],
                    'ext' => $telefonosData['ext'][$index],
                    'id_radio' => $telefonosData['id_radio'][$index],
                    'observaciones' => $telefonosData['observaciones'][$index],
                ];
            }
@@ -562,7 +550,6 @@ public function viewUpload()

    public function upload(Request $request)
    {
        try {
        $request->validate([
            'csv_file' => 'required|mimes:csv,txt',
        ]);
@@ -587,25 +574,25 @@ public function upload(Request $request)
            $existProfesion = $profesiones->firstWhere('nombre', $row['profesion']);

            $datosContacto = [
                    'nombre' => !empty($row['nombre']) ? $row['nombre'] : null,
                    'ap_paterno' => !empty($row['ap_paterno']) ? $row['ap_paterno'] : null,
                    'ap_materno' => !empty($row['ap_materno']) ? $row['ap_materno'] : null,
                    'cargo_desc' => !empty($row['cargo_desc']) ? $row['cargo_desc'] : null,
                    'mes_cump' => !empty($row['mes_cump']) ? $row['mes_cump'] : null,
                    'dia_cump' => !empty($row['dia_cump']) ? $row['dia_cump'] : null,
                    'domicilio_oficial' => !empty($row['domicilio_oficial']) ? $row['domicilio_oficial'] : null,
                    'codigo_postal' => !empty($row['codigo_postal']) ? $row['codigo_postal'] : null,
                    'localidad_oficial' => !empty($row['localidad_oficial']) ? $row['localidad_oficial'] : null,
                    'municipio_oficial' => !empty($row['municipio_oficial']) ? $row['municipio_oficial'] : null,
                    'estado' => !empty($row['estado']) ? $row['estado'] : null,
                    'pais' => !empty($row['pais']) ? $row['pais'] : null,
                    'domicilio_par' => !empty($row['domicilio_par']) ? $row['domicilio_par'] : null,
                    'codigo_postal_par' => !empty($row['codigo_postal_par']) ? $row['codigo_postal_par'] : null,
                    'localidad_par' => !empty($row['localidad_par']) ? $row['localidad_par'] : null,
                    'municipio_par' => !empty($row['municipio_par']) ? $row['municipio_par'] : null,
                    'estado_par' => !empty($row['estado_par']) ? $row['estado_par'] : null,
                    'pais_par' => !empty($row['pais_par']) ? $row['pais_par'] : null,
                    'finado' => !empty($row['finado']) ? $row['finado'] : 0,
                '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'
            ];

@@ -620,20 +607,17 @@ public function upload(Request $request)
            $tipos = explode(';', $row['tipo']);
            $estatuses = explode(';', $row['estatus']);
            $exts = explode(';', $row['ext']);
                $id_radios = explode(';', $row['id_radio']);
            $observaciones = explode(';', $row['observaciones']);
                //dd($id_radios);

            for ($i = 0; $i < count($numeros); $i++) {
                if ( $numeros[$i] != 'null') {
                    Telefono::create([
                        'contacto_id' => $contacto->id,
                            'numero' => !empty($numeros[$i]) ? $numeros[$i] : null,
                            'tipo' => !empty($tipos[$i]) ? $tipos[$i] : null,
                            'estatus' => !empty($estatuses[$i]) ? $estatuses[$i] : null,
                            'ext' => !empty($exts[$i]) ? $exts[$i] : null,
                            'id_radio' => !empty($id_radios[$i]) ? $id_radios[$i] : null,
                            'observaciones' => !empty($observaciones[$i]) ? $observaciones[$i] : null,
                        'numero' => $numeros[$i],
                        'tipo' => $tipos[$i],
                        'estatus' => $estatuses[$i],
                        'ext' => $exts[$i],
                        'observaciones' => $observaciones[$i],
                    ]);
                }
            }
@@ -665,7 +649,6 @@ public function upload(Request $request)
                    ]);
                }
            }
            }
    
            return redirect()->route('contacto.get')->with('success', 'Importación de contactos almacenada correctamente');
        } catch (\Throwable $th) {
+104 −0
Original line number Diff line number Diff line
<?php

namespace App\Http\Controllers;

use App\Models\Caracteristicas;
use App\Models\cargos;
use App\Models\Contacto;
use App\Models\Grupos;
use App\Models\Lista;
use Illuminate\Http\Request;

use App\Exports\ContactosExport;
use Maatwebsite\Excel\Facades\Excel;

class ReporteController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        $cargos = cargos::get();
        $caracteristicas = Caracteristicas::get();
        $grupos = Grupos::get();
        $listas = Lista::get();
        return view('adminGen.contactos.export', compact('cargos', 'caracteristicas', 'grupos', 'listas'));
    }

    /**
     * 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(string $id)
    {
        //
    }

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

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

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }

    public function find(Request $request)
    {
        $query = $request->input('q');

        $contactos = Contacto::where('nombre', 'like', '%' . $query . '%')->get(['id', 'nombre', 'ap_paterno', 'ap_materno']);
        return response()->json($contactos);
    }

    public function export(Request $request)
    {
        if(is_null($request->archivo)){
            return response()->json(['Error, No seleccionaste un archivo de exportación valido.'], 400);
        }

        // TODO: Traer datos de todos los contactos
        $contactIds = array_column($request->input('contactos', []), 'id');
        $extraFields = $request->input('exportar', []);
        $filters = [
            'listas' => $request->input('listas', []),
            'caracteristicas' => $request->input('caracteristicas', []),
            'grupos' => $request->input('grupos', []),
            'cargos' => $request->input('cargos', []),
        ];
        // TODO: Crear archivos de exportacion: PDF, Excel
        return Excel::download(new ContactosExport($contactIds, $extraFields, $filters), 'contactos.xlsx');
        //dd($request->all());
    }
}
+3 −5
Original line number Diff line number Diff line
@@ -12,8 +12,6 @@ class Contacto extends Model
{
    use HasFactory;

    //TODO Agregar la relacion hacia la tabla instituciones cuando Alejandro la tenga terminada.

    protected $fillable = [
        'nombre',
        'ap_paterno',
@@ -39,7 +37,7 @@ class Contacto extends Model
        'profesion_id',
        'cargo_id',
        'caracteristica_id',
        'institucion_id',
        'observacion',
    ];

    public function profesion(): BelongsTo
@@ -87,8 +85,8 @@ public function grupos(): BelongsToMany
        return $this->belongsToMany(Grupos::class, 'contactos_grupos', 'contacto_id', 'grupo_id');
    }

    public function institucion(): BelongsTo
    public function caracteristicas()
    {
        return $this->belongsTo(Instituciones::class);
        return $this->belongsTo(Caracteristicas::class, 'caracteristica_id');
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -11,6 +11,8 @@
        "laravel/sanctum": "^4.0",
        "laravel/tinker": "^2.9",
        "livewire/livewire": "^3.0",
        "maatwebsite/excel": "*",
        "psr/simple-cache": "2.0",
        "ramsey/uuid": "^4.7",
        "spatie/laravel-permission": "^6.7"
    },
Loading