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

Merge branch 'correcciones' into 'main'

Correcciones

See merge request !35
parents d05d62e6 fbcbeaf9
Loading
Loading
Loading
Loading
+22 −22
Original line number Diff line number Diff line
@@ -71,19 +71,18 @@ public function headings(): array

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

        }else{
            if (!empty($this->filters['subgrupos'])) {
                $query->orWhereHas('subgrupos', function ($q) {
                    $q->whereIn('subgrupos.id', $this->filters['subgrupos']);
                });
            } elseif (!empty($this->filters['grupos'])) {
                $grupoId = $this->filters['grupos'];
            $subgruposIds = Grupos::find(153)->subgrupos->pluck('id')->toArray();
                $subgruposIds = Grupos::find($grupoId)->subgrupos->pluck('id')->toArray();
        
                $query->where(function ($query) use ($grupoId, $subgruposIds) {
                    // Contactos directamente en el grupo
@@ -99,6 +98,7 @@ private function applyFilters($query)
                    }
                });
            }
        }

        if ($this->filters['mesInicio'] != "NaN" && $this->filters['diaInicio'] != "NaN") {
            $mesInicio = $this->filters['mesInicio'];
+145 −0
Original line number Diff line number Diff line
<?php

namespace App\Exports;

use App\Models\Lista;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class ListasExport implements FromCollection, WithHeadings
{
    protected $extraFields;
    protected $lista_id;

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

    public function collection()
    {
        $lista = Lista::with(['grupos', 'subgrupos', 'contactos'])->find($this->lista_id);
        $contactos = new Collection();
        $contactos = $contactos->merge($lista->contactos);

        foreach ($lista->grupos as $grupo) {
            $contactos = $contactos->merge($grupo->contactos);

            foreach ($grupo->subgrupos as $subgrupo) {
                $contactos = $contactos->merge($subgrupo->contactos);
            }
        }
        foreach($lista->subgrupos as $subgrupo){
            $contactos = $contactos->merge($subgrupo->contactos);
        }

        $contactos = $contactos->unique('id');

        return $contactos->map(function($contacto){
            return $this->formatContactoData($contacto);
        });
    }

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

    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',
            'Descripción del cargo' => $contacto->cargo_desc ?? 'N/A',
            'Grupo' => $contacto->grupos->pluck('nombre')[0] ?? 'N/A',
            'Subgrupo' => $contacto->subgrupos->pluck('nombre')[0] ?? 'N/A',
        ];

        $extraData = [];
        $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, [
                        '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',
                        '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 = [];
        $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']);
                    break;
                case 'cumpleanos':
                    $headings[] = 'Cumpleaños';
                    break;
                case 'telefonos':
                    $headings = array_merge($headings, ['Número de teléfono', 'Tipo', 'Estatus', 'Extensión', '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;
    }
}
+4 −3
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ class ContactoController extends Controller
     */
    public function index()
    {
        $contactos = Contacto::with('profesion', 'cargo')->get();
        $contactos = Contacto::with('profesion', 'cargo', 'grupos', 'subgrupos')->get();
        return view('adminGen.contactos.index', compact('contactos'));
    }

@@ -646,7 +646,7 @@ public function obtenerEventos(Request $request){
                });
            }
        })
        ->select('id', 'nombre', 'ap_paterno', 'ap_materno', 'mes_cump', 'dia_cump')
        ->select('id', 'nombre', 'ap_paterno', 'ap_materno', 'mes_cump', 'dia_cump', 'cargo_desc')
        ->get();

        // Obtener aniversarios de instituciones en el rango de fechas visible
@@ -661,7 +661,8 @@ public function obtenerEventos(Request $request){
                'title' => $contacto->nombre . ' ' . $contacto->ap_paterno. ' ' . $contacto->ap_materno,
                'start' => now()->year . '-' . str_pad($contacto->mes_cump, 2, '0', STR_PAD_LEFT) . '-' . str_pad($contacto->dia_cump, 2, '0', STR_PAD_LEFT),
                'className' => 'success',
                'description' => 'Cumpleaños de ' . $contacto->nombre,
                'cargo' => $contacto->cargo->nombre ?? 'Sin información',
                'description' => $contacto->cargo_desc ?? 'Sin información',
            ];
        })->merge($aniversarios->map(function ($institucion) {
            return [
+85 −28
Original line number Diff line number Diff line
@@ -10,10 +10,13 @@
use Illuminate\Http\Request;

use App\Exports\ContactosExport;
use App\Exports\ListasExport;
use App\Models\Subgrupo;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
use ZipArchive;
use Illuminate\Support\Str;

class ReporteController extends Controller
{
@@ -26,7 +29,8 @@ public function index()
        $caracteristicas = Caracteristicas::get();
        $grupos = Grupos::get();
        $listas = Lista::get();
        return view('adminGen.contactos.export', compact('cargos', 'caracteristicas', 'grupos', 'listas'));
        $subgrupos = Subgrupo::get();
        return view('adminGen.contactos.export', compact('cargos', 'caracteristicas', 'grupos', 'listas', 'subgrupos'));
    }

    /**
@@ -88,11 +92,15 @@ public function find(Request $request)
    public function export(Request $request)
    {
        if(is_null($request->archivo)){
            return response()->json(['Error, No seleccionaste un archivo de exportación valido.'], 400);
            return response()->json(['message' => 'No seleccionaste un archivo de exportación valido.'], 400);
        }

        $contactIds = array_column($request->input('contactos', []), 'id');
        $extraFields = $request->input('exportar', []);
        if(!$extraFields){
            return response()->json(['message' => 'No seleccionaste campos a exportar.'], 400);
        }

        $filters = [
            'listas' => $request->input('listas', []),
            'subgrupos' => $request->input('subgrupos', []),
@@ -102,11 +110,12 @@ public function export(Request $request)
            'mesFin' => $request->input('mesFin'),
            'diaFin' => $request->input('diaFin'),
        ];
        try{
            $export = new ContactosExport($contactIds, $extraFields, $filters);
            if($request->archivo == 'excel'){
                return Excel::download($export, 'contactos.xlsx');
            }else if($request->archivo == 'pdf'){
            $pdf = Pdf::loadView('adminGen.contactos.contactos_pdf', ['contactos' => $export->collection()])->setPaper('A1', 'landscape');;
                $pdf = Pdf::loadView('adminGen.contactos.contactos_pdf', ['contactos' => $export->collection()])->setPaper('A1', 'landscape');
                return $pdf->download('contactos.pdf');
            }else if($request->archivo == 'ambos'){
                $excelPath = storage_path('app/public/contactos.xlsx');
@@ -128,8 +137,12 @@ public function export(Request $request)
                // Descargar archivo ZIP
                return response()->download($zipPath)->deleteFileAfterSend(true);
            }else{
            return response()->json(['Error, No seleccionaste un archivo de exportación valido.'], 400);
                return response()->json(['Error, no seleccionaste un archivo de exportación valido.'], 400);
            }
        }catch(\Exception $e){
            return response()->json(['message'=> $e->getMessage()], 500);
        }
        
    }

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

    public function exportListas(Request $request)
    {
        try{
            if(is_null($request->archivo)){
                return response()->json(['message' => 'No seleccionaste un archivo de exportación valido.'], 400);
            }
    
            $extraFields = $request->input('exportar', []);
            if(!$extraFields){
                return response()->json(['message' => 'No seleccionaste campos a exportar.'], 400);
            }
            $lista_id = $request->input('id');
    
            $export = new ListasExport($lista_id, $extraFields);
            $uuid = Str::uuid()->toString();
            if($request->archivo == 'excel'){
                return Excel::download($export, $uuid . '.xlsx');
            }else if($request->archivo == 'pdf'){
                $pdf = Pdf::loadView('adminGen.contactos.contactos_pdf', ['contactos' => $export->collection()])->setPaper('A1', 'landscape');
                return $pdf->download($uuid.'.pdf');
            }else if($request->archivo == 'ambos'){
                $excelPath = storage_path('app/public/contactos.xlsx');
                $pdfPath = storage_path('app/public/contactos.pdf');

                Excel::store($export, 'public/contactos.xlsx');
                $pdf = Pdf::loadView('adminGen.contactos.contactos_pdf', ['contactos' => $export->collection()])->setPaper('A1', 'landscape');
                Storage::put('public/contactos.pdf', $pdf->output());
                $zipPath = storage_path('app/public/'.$uuid.'.zip');
                $zip = new ZipArchive;
                if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
                    $zip->addFile($excelPath, $uuid.'.xlsx');
                    $zip->addFile($pdfPath, $uuid.'.pdf');
                    $zip->close();
                }

                return response()->download($zipPath)->deleteFileAfterSend(true);
            }else{
                return response()->json(['message' => 'no seleccionaste un archivo de exportación valido.'], 400);
            }
        }catch(\Exception $e){
            return response()->json(['message' => $e->getMessage()], 500);
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -34,6 +34,6 @@ public function listas(): BelongsToMany

    public function contactos(): BelongsToMany
    {
        return $this->belongsToMany(Contacto::class, 'contactos_subgrupos', 'contacto_id', 'subgrupo_id');
        return $this->belongsToMany(Contacto::class, 'contactos_subgrupos', 'subgrupo_id', 'contacto_id');
    }
}
Loading