Loading app/Exports/ContactosExport.php +85 −37 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading @@ -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']); }); } */ Loading @@ -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) Loading @@ -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, [ Loading Loading @@ -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']); Loading app/Http/Controllers/ReporteController.php +22 −3 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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. } } resources/views/adminGen/contactos/export.blade.php +9 −5 Original line number Diff line number Diff line Loading @@ -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', { Loading routes/web.php +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
app/Exports/ContactosExport.php +85 −37 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading @@ -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']); }); } */ Loading @@ -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) Loading @@ -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, [ Loading Loading @@ -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']); Loading
app/Http/Controllers/ReporteController.php +22 −3 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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. } }
resources/views/adminGen/contactos/export.blade.php +9 −5 Original line number Diff line number Diff line Loading @@ -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', { Loading
routes/web.php +2 −1 Original line number Diff line number Diff line Loading @@ -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