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

Exportacion de excel

parent d5510a22
Loading
Loading
Loading
Loading
+86 −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
{
    /**
    * @return \Illuminate\Support\Collection
    */

    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();

        // Si se envían IDs específicos
        if (!empty($this->contactIds)) {
            $query->whereIn('contactos.id', $this->contactIds);
        }

        // Filtros adicionales
        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']);
            });
        }

        $contactos = $query->with(['profesion', 'cargo', 'caracteristicas'])->get();

        return $contactos->map(function ($contacto) {
            $defaultData = [
                'Profesión' => $contacto->profesion->nombre ?? '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) {
                $extraData[$field] = $contacto->{$field} ?? 'N/A';
            }

            return array_merge($defaultData, $extraData);
        });
    }

    public function headings(): array
    {
        $defaultHeadings = ['Profesión', 'Nombre', 'Apellido Paterno', 'Apellido Materno', 'Cargo'];
        return array_merge($defaultHeadings, $this->extraFields);
    }
}
+22 −1
Original line number Diff line number Diff line
@@ -9,6 +9,9 @@
use App\Models\Lista;
use Illuminate\Http\Request;

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

class ReporteController extends Controller
{
    /**
@@ -84,6 +87,24 @@ public function export(Request $request)
        if(is_null($request->archivo)){
            return response()->json(['Error, No seleccionaste un archivo de exportación valido.'], 400);
        }
        dd($request->all());

        // 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', []),
        ];
        // Listas
        // Caracteristicas 
        // Grupos
        // Cargos
        // Contactos
        // Agrupar todos los contactos
        // TODO: Crear archivos de exportacion: PDF, Excel
        return Excel::download(new ContactosExport($contactIds, $extraFields, $filters), 'contactos.xlsx');
        //dd($request->all());
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -91,4 +91,9 @@ public function institucion(): BelongsTo
    {
        return $this->belongsTo(Instituciones::class);
    }

    public function caracteristicas()
    {
        return $this->belongsTo(Caracteristicas::class, 'caracteristica_id');
    }
}
+22 −4
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ class="w-full px-3 py-2 bg-white border border-gray-300 rounded-md"
                            <select id="exportar" class="w-full px-3 py-2 bg-white border border-gray-300 rounded-md">
                                <option value="" disabled selected>Selecciona los campos a exportar</option>
                                <option value="todos">Todos</option>
                                <option value="tonyuge">Cónyuge</option>
                                <option value="conyuge">Cónyuge</option>
                                <option value="contacto_directo">Contacto Directo</option>
                                <option value="domicilio">Domicilio</option>
                                <option value="cumpleanos">Cumpleaños</option>
@@ -238,9 +238,27 @@ function logData() {
                    "X-CSRF-Token": $('meta[name="_token"]').attr('content')
                }
            })
            .then(response => response.json())
            .then(json => showToast(json, 'Error', 'error'))
            .catch(err => showToast(err[0], 'Error', 'error'));
                .then(response => {
                    if (!response.ok) {
                        return response.json().then(err => {
                            throw err;
                        });
                    }
                    return response.blob(); // Procesar como Blob (archivo binario)
                })
                .then(blob => {
                    const url = window.URL.createObjectURL(blob); // Crear URL temporal para el archivo
                    const link = document.createElement('a'); // Crear un elemento <a> dinámicamente
                    link.href = url;
                    link.download = 'contactos_report.xlsx'; // Nombre del archivo
                    document.body.appendChild(link); // Añadir el enlace al DOM
                    link.click(); // Simular clic para iniciar descarga
                    link.remove(); // Remover el enlace del DOM
                    window.URL.revokeObjectURL(url); // Liberar el URL temporal
                })
                .catch(err => {
                    showToast(err.message || 'Error al descargar el archivo', 'Error', 'error');
                });
        }
    </script>

+1 −1

File changed.

Contains only whitespace changes.