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

Primer paso de mejora en la implementacion de filtros

parent 79ba40ce
Loading
Loading
Loading
Loading
+96 −60
Original line number Diff line number Diff line
@@ -4,15 +4,10 @@

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;
@@ -27,13 +22,38 @@ public function __construct($contactIds, $extraFields = [], $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
        // 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']);
@@ -57,10 +77,10 @@ public function collection()
                $q->whereIn('cargos.id', $this->filters['cargos']);
            });
        }
    }

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

        return $contactos->map(function ($contacto) {
    private function formatContactoData($contacto)
    {
        $defaultData = [
            'Profesión' => $contacto->profesion->abreviatura ?? 'N/A',
            'Nombre' => $contacto->nombre,
@@ -71,55 +91,71 @@ public function collection()

        $extraData = [];
        foreach ($this->extraFields as $field) {
                if ($field === 'domicilio') {
                    // Agregar detalles del domicilio
                    $extraData['Domicilio Oficial'] = $contacto->domicilio_oficial ?? 'N/A';
                    $extraData['Código Postal'] = $contacto->codigo_postal ?? 'N/A';
                    $extraData['Localidad Oficial'] = $contacto->localidad_oficial ?? 'N/A';
                    $extraData['Municipio Oficial'] = $contacto->municipio_oficial ?? 'N/A';
                    $extraData['Estado'] = $contacto->estado ?? 'N/A';
                    $extraData['País'] = $contacto->pais ?? 'N/A';
                } elseif ($field === 'cumpleanos') {
            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';
                }else if($field === 'telefonos'){
                    $extraData['Número de teléfono'] = $contacto->telefonos->pluck('numero')->join(', ') ?? 'N/A';
                    $extraData['Tipo'] = $contacto->telefonos->pluck('tipo')->join(', ') ?? 'N/A';
                    $extraData['Estatus'] = $contacto->telefonos->pluck('estatus')->join(', ') ?? 'N/A';
                    $extraData['Extensión'] = $contacto->telefonos->pluck('ext')->join(', ') ?? 'N/A';
                    $extraData['ID Radio'] = $contacto->telefonos->pluck('id_radio')->join(', ') ?? 'N/A';
                    $extraData['Observaciones'] = $contacto->telefonos->pluck('observaciones')->join(', ') ?? 'N/A';
                }else if($field === 'conyuge'){
                    $extraData['Cónyuge'] = $contacto->pareja->nombre && $contacto->pareja->ap_paterno && $contacto->pareja->ap_materno
                        ? $contacto->pareja->nombre . ' ' . $contacto->ap_paterno . ' ' . $contacto->pareja->ap_materno
                    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);
        });
    }

    public function headings(): array
    private function getExtraHeadings()
    {
        $defaultHeadings = ['Profesión', 'Nombre', 'Apellido Paterno', 'Apellido Materno', 'Cargo'];
        $extraHeadings = '';
        $headings = [];
        foreach ($this->extraFields as $field) {
            
            if ($field === 'domicilio') {
                $extraHeadings = ['Domicilio', 'Código Postal', 'Localidad', 'Municipio', 'Estado', 'Pais'];
                $defaultHeadings = array_merge($defaultHeadings, $extraHeadings);
            } elseif ($field === 'cumpleanos') {
                $extraHeadings = ['Cumpleaños'];
                $defaultHeadings = array_merge($defaultHeadings, $extraHeadings);
            } elseif ($field === 'telefonos') {
                $extraHeadings = ['Teléfonos', 'Tipo', 'Estatus', 'Extensión', 'ID Radio', 'Observaciones'];
                $defaultHeadings = array_merge($defaultHeadings, $extraHeadings);
            } elseif ($field === 'conyuge') {
                $extraHeadings[] = 'Cónyuge';
            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 $defaultHeadings;
        return $headings;
    }
}
 No newline at end of file