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

Primera parte de exportar excel terminada

parent 732760cf
Loading
Loading
Loading
Loading
+85 −37
Original line number Diff line number Diff line
@@ -23,9 +23,6 @@ public function __construct($contactIds, $extraFields = [], $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);
@@ -34,12 +31,25 @@ public function collection()
        $contactos = $query->with([
            'profesion',
            'cargo',
            'caracteristicas',
            'telefonos',
            'pareja',
            'correos'
        ])->get();

        if (!empty($this->contactIds)) {
            $contactosObligatorios = Contacto::whereIn('id', $this->contactIds)->with([
                'profesion',
                'cargo',
                'telefonos',
                'pareja',
                'correos'
            ])->get();
    
            // Combinar los resultados y eliminar duplicados
            $contactos = $contactos->merge($contactosObligatorios)->unique('id');    

        }

        // Mapear los datos a un formato exportable
        return $contactos->map(function ($contacto) {
            return $this->formatContactoData($contacto);
@@ -55,15 +65,9 @@ public function headings(): array

    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['subgrupos'])){
            $query->orWhereHas('subgrupos', function ($q) {
                $q->whereIn('subgrupos.id', $this->filters['subgrupos']);
            });
        } */

@@ -71,35 +75,67 @@ private function applyFilters($query)
            $query->orWhereHas('subgrupos', function ($q) {
                $q->whereIn('subgrupos.id', $this->filters['subgrupos']);
            });
        }

        if(!empty($this->filters['grupos'])){
        } elseif (!empty($this->filters['grupos'])) {
            $grupoId = $this->filters['grupos'];
            $subgruposIds = Grupos::find($grupoId)->subgrupos->pluck('id')->toArray();
    
            $query->where(function ($query) use ($grupoId, $subgruposIds) {
                $query->whereHas('grupos', function ($q) use ($grupoId) {
                // Contactos directamente en el grupo
                $query->orWhereHas('grupos', function ($q) use ($grupoId) {
                    $q->where('grupos.id', $grupoId);
                })->orWhereHas('subgrupos', function ($q) use ($subgruposIds) {
                    $q->whereIn('subgrupos.id', $subgruposIds);
                });
    
                // Contactos en subgrupos del grupo (solo si hay subgrupos)
                if (!empty($subgruposIds)) {
                    $query->orWhereHas('subgrupos', function ($q) use ($subgruposIds) {
                        $q->whereIn('subgrupos.id', $subgruposIds);
                    });
                }

        if (!empty($this->filters['fechaInicio']) && !empty($this->filters['fechaFin'])) {
            // Filtrar por rango de fechas (mes/día)
            $fechaInicio = $this->filters['fechaInicio'];
            $fechaFin = $this->filters['fechaFin'];
            $query->where(function ($query) use ($fechaInicio, $fechaFin) {
                $query->whereRaw("CONCAT(LPAD(mes_cump, 2, '0'), '-', LPAD(dia_cump, 2, '0')) >= ?", [$fechaInicio])
                      ->whereRaw("CONCAT(LPAD(mes_cump, 2, '0'), '-', LPAD(dia_cump, 2, '0')) <= ?", [$fechaFin]);
            });
        }

        /* if (!empty($this->filters['cargos'])) {
            $query->orWhereHas('cargo', function ($q) {
                $q->whereIn('cargos.id', $this->filters['cargos']);
        if ($this->filters['mesInicio'] != "NaN" && $this->filters['diaInicio'] != "NaN") {
            $mesInicio = $this->filters['mesInicio'];
            $diaInicio = $this->filters['diaInicio'];
    
            if ($this->filters['mesFin'] != "NaN" && $this->filters['diaFin'] != "NaN") {
                $mesFin = $this->filters['mesFin'];
                $diaFin = $this->filters['diaFin'];
    
                if ($mesInicio === $mesFin && $diaInicio === $diaFin) {
                    $query->where('mes_cump', $mesInicio)
                          ->where('dia_cump', $diaInicio);
                } else {
                    $query->where(function ($query) use ($mesInicio, $diaInicio, $mesFin, $diaFin) {
                        // Condición para fechas dentro del mismo mes
                        $query->where(function ($query) use ($mesInicio, $diaInicio, $mesFin, $diaFin) {
                            $query->where('mes_cump', $mesInicio)
                                  ->whereBetween('dia_cump', [$diaInicio, $diaFin]);
                        })
                        // Condición para fechas que abarcan varios meses
                        ->orWhere(function ($query) use ($mesInicio, $diaInicio, $mesFin, $diaFin) {
                            $query->where(function ($query) use ($mesInicio, $diaInicio) {
                                $query->where('mes_cump', '>', $mesInicio)
                                      ->orWhere(function ($query) use ($mesInicio, $diaInicio) {
                                          $query->where('mes_cump', $mesInicio)
                                                ->where('dia_cump', '>=', $diaInicio);
                                      });
                            })
                            ->where(function ($query) use ($mesFin, $diaFin) {
                                $query->where('mes_cump', '<', $mesFin)
                                      ->orWhere(function ($query) use ($mesFin, $diaFin) {
                                          $query->where('mes_cump', $mesFin)
                                                ->where('dia_cump', '<=', $diaFin);
                                      });
                            });
                        });
                    });
        } */
                }
            } else {
                $query->where('mes_cump', $mesInicio)
                      ->where('dia_cump', $diaInicio);
            }
        }
    }

    private function formatContactoData($contacto)
@@ -113,7 +149,13 @@ private function formatContactoData($contacto)
        ];

        $extraData = [];
        foreach ($this->extraFields as $field) {
        $fields = $this->extraFields;

        if (in_array('todos', $fields)) {
            $fields = ['domicilio', 'cumpleanos', 'telefonos', 'conyuge', 'email'];
        }

        foreach ($fields as $field) {
            switch ($field) {
                case 'domicilio':
                    $extraData = array_merge($extraData, [
@@ -159,7 +201,13 @@ private function formatContactoData($contacto)
    private function getExtraHeadings()
    {
        $headings = [];
        foreach ($this->extraFields as $field) {
        $fields = $this->extraFields;

        if (in_array('todos', $fields)) {
            $fields = ['domicilio', 'cumpleanos', 'telefonos', 'conyuge', 'email'];
        }

        foreach ($fields as $field) {
            switch ($field) {
                case 'domicilio':
                    $headings = array_merge($headings, ['Domicilio Oficial', 'Código Postal', 'Localidad Oficial', 'Municipio Oficial', 'Estado', 'País']);
+22 −3
Original line number Diff line number Diff line
@@ -95,12 +95,13 @@ public function export(Request $request)
            'listas' => $request->input('listas', []),
            'subgrupos' => $request->input('subgrupos', []),
            'grupos' => $request->input('grupo'),
            'fechaInicio' => $request->input('fechaInicio'),
            'fechaFin' => $request->input('fechaFin'),
            'mesInicio' => $request->input('mesInicio'),
            'diaInicio' => $request->input('diaInicio'),
            'mesFin' => $request->input('mesFin'),
            'diaFin' => $request->input('diaFin'),
        ];
        // TODO: Crear archivos de exportacion: PDF, Excel
        return Excel::download(new ContactosExport($contactIds, $extraFields, $filters), 'contactos.xlsx');
        //dd($request->all());
    }

    public function getSubgrupos(Int $id)
@@ -108,4 +109,22 @@ public function getSubgrupos(Int $id)
        $grupo = Grupos::find($id);
        return response()->json($grupo->subgrupos);
    }

    public function test()
    {
        // Paso 1: Verifica que el Grupo 1 existe
        $grupo = Grupos::find(1);

        // Paso 2: Verifica los subgrupos del Grupo 1
        $subgruposIds = $grupo->subgrupos->pluck('id');

        // Paso 3: Busca contactos asociados al Grupo 1 o sus subgrupos
        $contactos = Contacto::whereHas('grupos', function ($q) {
            $q->where('grupos.id', 1); // Grupo 1
        })->orWhereHas('subgrupos', function ($q) use ($subgruposIds) {
            $q->whereIn('subgrupos.id', $subgruposIds); // Subgrupos 1 y 3
        })->get();

        dd($contactos); // Debe mostrar los contactos 46 y 47.
    }
}
+9 −5
Original line number Diff line number Diff line
@@ -237,20 +237,24 @@ function logData() {
            const select = document.getElementById('archivo');
            const selectedOption = select.options[select.selectedIndex];

            const fechaInicio = document.getElementById('fechaInicio').value;
            const fechaFin = document.getElementById('fechaFin').value;
            const fechaInicio = new Date(document.getElementById('fechaInicio').value);
            const fechaFin = new Date(document.getElementById('fechaFin').value);
            fechaInicio.setHours(fechaInicio.getHours() + 6);
            fechaFin.setHours(fechaFin.getHours() + 6);

            
            const data = {
                contactos: contactosSeleccionados,
                listas: listasSeleccion,
                caracteristicas: caracteristicasSeleccion,
                subgrupos: subgruposSeleccion,
                cargos: cargosSeleccion,
                exportar: exportarSeleccion,
                archivo: selectedOption.value,
                grupo: document.getElementById('grupos').value,
                fechaInicio: fechaInicio ? new Date(fechaInicio).toISOString().slice(5, 10) : null,
                fechaFin: fechaFin ? new Date(fechaFin).toISOString().slice(5, 10) : null,
                mesInicio: fechaInicio ? (fechaInicio.getMonth() + 1).toString().padStart(2, '0') : null,
                diaInicio: fechaInicio ? fechaInicio.getDate().toString().padStart(2, '0') : null,
                mesFin: fechaFin ? (fechaFin.getMonth() + 1).toString().padStart(2, '0') : null,
                diaFin: fechaFin ? fechaFin.getDate().toString().padStart(2, '0') : null,
            };

            fetch('/reportes/contactos/exportar', {
+2 −1
Original line number Diff line number Diff line
@@ -157,4 +157,5 @@
        Route::get('/reportes/contactos/buscar', [ReporteController::class, 'find'])->name('find')->middleware(CheckRoles::class . ':admingen,admin,capturista,lector');
        Route::post('/reportes/contactos/exportar', [ReporteController::class, 'export'])->name('export')->middleware(CheckRoles::class . ':admingen,admin,capturista,lector');
        Route::get('/reportes/subgrupos/{id}', [ReporteController::class, 'getSubgrupos'])->name('subgrupos')->middleware(CheckRoles::class . ':admingen,admin,capturista,lector');
        Route::get('/test', [ReporteController::class, 'test'])->name('test');
    });
 No newline at end of file