Loading app/Exports/ContactosExport.php 0 → 100644 +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); } } app/Http/Controllers/ReporteController.php +22 −1 Original line number Diff line number Diff line Loading @@ -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 { /** Loading Loading @@ -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()); } } app/Models/Contacto.php +5 −0 Original line number Diff line number Diff line Loading @@ -91,4 +91,9 @@ public function institucion(): BelongsTo { return $this->belongsTo(Instituciones::class); } public function caracteristicas() { return $this->belongsTo(Caracteristicas::class, 'caracteristica_id'); } } resources/views/adminGen/contactos/export.blade.php +22 −4 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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> Loading app/Models/cargos.php +1 −1 File changed.Contains only whitespace changes. Show changes Loading
app/Exports/ContactosExport.php 0 → 100644 +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); } }
app/Http/Controllers/ReporteController.php +22 −1 Original line number Diff line number Diff line Loading @@ -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 { /** Loading Loading @@ -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()); } }
app/Models/Contacto.php +5 −0 Original line number Diff line number Diff line Loading @@ -91,4 +91,9 @@ public function institucion(): BelongsTo { return $this->belongsTo(Instituciones::class); } public function caracteristicas() { return $this->belongsTo(Caracteristicas::class, 'caracteristica_id'); } }
resources/views/adminGen/contactos/export.blade.php +22 −4 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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> Loading