Commit 57e462b64210f9eaa7dd0391de7033012d121930
Committed by
Eduardo Santos
1 parent
5e645f47
Exists in
master
and in
1 other branch
Adiciona exportar em CSV todas as coletas WMI e muda o layout dos relatórios para usar o datatable
Showing
5 changed files
with
190 additions
and
10 deletions
Show diff stats
src/Cacic/CommonBundle/Entity/ComputadorColetaRepository.php
| ... | ... | @@ -46,7 +46,7 @@ class ComputadorColetaRepository extends EntityRepository |
| 46 | 46 | public function gerarRelatorioConfiguracoes( $filtros ) |
| 47 | 47 | { |
| 48 | 48 | $qb = $this->createQueryBuilder('coleta') |
| 49 | - ->select('IDENTITY(coleta.computador), coleta.teClassPropertyValue, comp.nmComputador, comp.teNodeAddress, comp.teIpComputador, so.idSo, so.inMswindows, so.sgSo, rede.idRede, local.nmLocal, local.idLocal') | |
| 49 | + ->select('IDENTITY(coleta.computador), coleta.teClassPropertyValue, comp.nmComputador, comp.teNodeAddress, comp.teIpComputador, so.idSo, so.inMswindows, so.sgSo, so.teDescSo, rede.idRede, local.nmLocal, local.idLocal') | |
| 50 | 50 | ->innerJoin('coleta.classProperty', 'property') |
| 51 | 51 | ->innerJoin('property.idClass', 'classe') |
| 52 | 52 | ->innerJoin('coleta.computador', 'comp') |
| ... | ... | @@ -244,7 +244,7 @@ class ComputadorColetaRepository extends EntityRepository |
| 244 | 244 | public function gerarRelatorioWMI( $filtros, $classe ) |
| 245 | 245 | { |
| 246 | 246 | $qb = $this->createQueryBuilder('coleta') |
| 247 | - ->select('property.nmPropertyName', 'coleta.teClassPropertyValue', 'so.idSo', 'so.inMswindows', 'so.sgSo', 'rede.idRede', 'rede.nmRede', 'rede.teIpRede', 'local.nmLocal', 'local.idLocal', 'count(DISTINCT coleta.computador) as numComp') | |
| 247 | + ->select('property.nmPropertyName', 'coleta.teClassPropertyValue', 'so.idSo', 'so.inMswindows', 'so.sgSo', 'so.teDescSo', 'rede.idRede', 'rede.nmRede', 'rede.teIpRede', 'local.nmLocal', 'local.idLocal', 'count(DISTINCT coleta.computador) as numComp') | |
| 248 | 248 | ->innerJoin('coleta.classProperty', 'property') |
| 249 | 249 | ->innerJoin('property.idClass', 'classe') |
| 250 | 250 | ->innerJoin('coleta.computador', 'comp') | ... | ... |
src/Cacic/RelatorioBundle/Controller/HardwareController.php
| ... | ... | @@ -6,6 +6,12 @@ use Doctrine\Common\Util\Debug; |
| 6 | 6 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
| 7 | 7 | use Symfony\Component\HttpFoundation\Request; |
| 8 | 8 | |
| 9 | +use Ddeboer\DataImport\Workflow; | |
| 10 | +use Ddeboer\DataImport\Reader\ArrayReader; | |
| 11 | +use Ddeboer\DataImport\Writer\CsvWriter; | |
| 12 | +use Ddeboer\DataImport\ValueConverter\CallbackValueConverter; | |
| 13 | +use Symfony\Component\HttpFoundation\BinaryFileResponse; | |
| 14 | + | |
| 9 | 15 | class HardwareController extends Controller |
| 10 | 16 | { |
| 11 | 17 | |
| ... | ... | @@ -75,9 +81,12 @@ class HardwareController extends Controller |
| 75 | 81 | */ |
| 76 | 82 | public function wmiRelatorioAction( Request $request, $classe ) |
| 77 | 83 | { |
| 84 | + $filtros = $request->get('rel_filtro_hardware'); | |
| 85 | + | |
| 78 | 86 | $dados = $this->getDoctrine() |
| 79 | 87 | ->getRepository('CacicCommonBundle:ComputadorColeta') |
| 80 | - ->gerarRelatorioWMI( $filtros = $request->get('rel_filtro_hardware'), $classe = $classe ); | |
| 88 | + ->gerarRelatorioWMI($filtros , $classe = $classe ); | |
| 89 | + | |
| 81 | 90 | |
| 82 | 91 | $locale = $request->getLocale(); |
| 83 | 92 | return $this->render( |
| ... | ... | @@ -85,6 +94,7 @@ class HardwareController extends Controller |
| 85 | 94 | array( |
| 86 | 95 | 'idioma'=> $locale, |
| 87 | 96 | 'dados' => $dados, |
| 97 | + 'filtros' => $filtros, | |
| 88 | 98 | 'classe' => $classe |
| 89 | 99 | ) |
| 90 | 100 | ); |
| ... | ... | @@ -117,18 +127,159 @@ class HardwareController extends Controller |
| 117 | 127 | |
| 118 | 128 | $dados = $this->getDoctrine() |
| 119 | 129 | ->getRepository('CacicCommonBundle:ComputadorColeta') |
| 120 | - ->gerarRelatorioWMIDetalhe( $filtros = $filtros, $classe = $classe ); | |
| 130 | + ->gerarRelatorioWMIDetalhe( $filtros, $classe ); | |
| 121 | 131 | |
| 122 | 132 | $locale = $request->getLocale(); |
| 133 | + | |
| 134 | + // Pega o idClassProperty | |
| 135 | + $idClassProperty = $this | |
| 136 | + ->getDoctrine() | |
| 137 | + ->getManager() | |
| 138 | + ->createQuery("SELECT p.idClassProperty FROM CacicCommonBundle:ClassProperty p WHERE p.nmPropertyName = :propriedade") | |
| 139 | + ->setParameter('propriedade', $propriedade) | |
| 140 | + ->getArrayResult(); | |
| 141 | + | |
| 142 | + // Corrige para fazer o parsing da variável | |
| 143 | + $item = array(); | |
| 144 | + foreach ($idClassProperty as $elm) { | |
| 145 | + array_push($item, $elm['idClassProperty']); | |
| 146 | + } | |
| 147 | + $filtros['conf'] = join($item, ","); | |
| 148 | + | |
| 123 | 149 | return $this->render( |
| 124 | 150 | 'CacicRelatorioBundle:Hardware:rel_wmi_detalhe.html.twig', |
| 125 | 151 | array( |
| 126 | 152 | 'idioma'=> $locale, |
| 127 | 153 | 'dados' => $dados, |
| 128 | 154 | 'propriedade' => $propriedade, |
| 155 | + 'filtros' => $filtros, | |
| 129 | 156 | 'classe' => $classe |
| 130 | 157 | ) |
| 131 | 158 | ); |
| 132 | 159 | } |
| 160 | + | |
| 161 | + /** | |
| 162 | + * [RELATÓRIO] Relatório CSV de atributos da classe WMI gerado à partir dos filtros informados | |
| 163 | + */ | |
| 164 | + public function csvWMIRelatorioAction( Request $request, $classe ) | |
| 165 | + { | |
| 166 | + $conf = $request->get('conf'); | |
| 167 | + $rede = $request->get('rede'); | |
| 168 | + $local = $request->get('local'); | |
| 169 | + $so = $request->get('so'); | |
| 170 | + | |
| 171 | + // Adiciona rede à lista de filtros se for fornecido | |
| 172 | + if (!empty($rede)) { | |
| 173 | + $filtros['redes'] = $rede; | |
| 174 | + } | |
| 175 | + | |
| 176 | + // Adiciona local à lista de filtros se for fornecido | |
| 177 | + if (!empty($local)) { | |
| 178 | + $filtros['locais'] = $local; | |
| 179 | + } | |
| 180 | + | |
| 181 | + // Adiciona SO à lista de filtros se for fornecido | |
| 182 | + if (!empty($so)) { | |
| 183 | + $filtros['so'] = $so; | |
| 184 | + } | |
| 185 | + | |
| 186 | + // Adiciona Propriedades à lista de filtros se for fornecido | |
| 187 | + if (!empty($conf)) { | |
| 188 | + $filtros['conf'] = $conf; | |
| 189 | + } | |
| 190 | + | |
| 191 | + $dados = $this->getDoctrine() | |
| 192 | + ->getRepository('CacicCommonBundle:ComputadorColeta') | |
| 193 | + ->gerarRelatorioWMI( $filtros, $classe ); | |
| 194 | + | |
| 195 | + $locale = $request->getLocale(); | |
| 196 | + | |
| 197 | + // Gera cabeçalho | |
| 198 | + $cabecalho = array(); | |
| 199 | + foreach($dados as $elm) { | |
| 200 | + array_push($cabecalho, array_keys($elm)); | |
| 201 | + break; | |
| 202 | + } | |
| 203 | + // Gera CSV | |
| 204 | + $reader = new ArrayReader(array_merge($cabecalho, $dados)); | |
| 205 | + | |
| 206 | + // Create the workflow from the reader | |
| 207 | + $workflow = new Workflow($reader); | |
| 208 | + | |
| 209 | + // Add the writer to the workflow | |
| 210 | + $tmpfile = tempnam(sys_get_temp_dir(), $classe.".csv"); | |
| 211 | + $file = new \SplFileObject($tmpfile, 'w'); | |
| 212 | + $writer = new CsvWriter($file); | |
| 213 | + $workflow->addWriter($writer); | |
| 214 | + | |
| 215 | + // Process the workflow | |
| 216 | + $workflow->process(); | |
| 217 | + | |
| 218 | + // Retorna o arquivo | |
| 219 | + $response = new BinaryFileResponse($tmpfile); | |
| 220 | + $response->headers->set('Content-Type', 'text/csv'); | |
| 221 | + $response->headers->set('Content-Disposition', "attachment; filename=$classe.csv"); | |
| 222 | + $response->headers->set('Content-Transfer-Encoding', 'binary'); | |
| 223 | + | |
| 224 | + return $response; | |
| 225 | + } | |
| 226 | + | |
| 227 | + public function csvWMIRelatorioDetalheAction( Request $request, $classe, $propriedade ) | |
| 228 | + { | |
| 229 | + $filtros['conf'] = $propriedade; | |
| 230 | + $rede = $request->get('rede'); | |
| 231 | + $local = $request->get('local'); | |
| 232 | + $so = $request->get('so'); | |
| 233 | + | |
| 234 | + // Adiciona rede à lista de filtros se for fornecido | |
| 235 | + if (!empty($rede)) { | |
| 236 | + $filtros['redes'] = $rede; | |
| 237 | + } | |
| 238 | + | |
| 239 | + // Adiciona local à lista de filtros se for fornecido | |
| 240 | + if (!empty($local)) { | |
| 241 | + $filtros['locais'] = $local; | |
| 242 | + } | |
| 243 | + | |
| 244 | + // Adiciona SO à lista de filtros se for fornecido | |
| 245 | + if (!empty($so)) { | |
| 246 | + $filtros['so'] = $so; | |
| 247 | + } | |
| 248 | + | |
| 249 | + $dados = $this->getDoctrine() | |
| 250 | + ->getRepository('CacicCommonBundle:ComputadorColeta') | |
| 251 | + ->gerarRelatorioWMIDetalhe( $filtros, $classe ); | |
| 252 | + | |
| 253 | + $locale = $request->getLocale(); | |
| 254 | + | |
| 255 | + // Gera cabeçalho | |
| 256 | + $cabecalho = array(); | |
| 257 | + foreach($dados as $elm) { | |
| 258 | + array_push($cabecalho, array_keys($elm)); | |
| 259 | + break; | |
| 260 | + } | |
| 261 | + // Gera CSV | |
| 262 | + $reader = new ArrayReader(array_merge($cabecalho, $dados)); | |
| 263 | + | |
| 264 | + // Create the workflow from the reader | |
| 265 | + $workflow = new Workflow($reader); | |
| 266 | + | |
| 267 | + // Add the writer to the workflow | |
| 268 | + $tmpfile = tempnam(sys_get_temp_dir(), $propriedade.".csv"); | |
| 269 | + $file = new \SplFileObject($tmpfile, 'w'); | |
| 270 | + $writer = new CsvWriter($file); | |
| 271 | + $workflow->addWriter($writer); | |
| 272 | + | |
| 273 | + // Process the workflow | |
| 274 | + $workflow->process(); | |
| 275 | + | |
| 276 | + // Retorna o arquivo | |
| 277 | + $response = new BinaryFileResponse($tmpfile); | |
| 278 | + $response->headers->set('Content-Type', 'text/csv'); | |
| 279 | + $response->headers->set('Content-Disposition', "attachment; filename=$propriedade.csv"); | |
| 280 | + $response->headers->set('Content-Transfer-Encoding', 'binary'); | |
| 281 | + | |
| 282 | + return $response; | |
| 283 | + } | |
| 133 | 284 | |
| 134 | 285 | } | ... | ... |
src/Cacic/RelatorioBundle/Resources/config/routing.yml
| ... | ... | @@ -166,4 +166,12 @@ cacic_inativos_listar_csv: |
| 166 | 166 | pattern: /inativos/listar/csv/{idRede}/{dtAcaoInicio}/{dtAcaoFim} |
| 167 | 167 | defaults: { _controller: CacicRelatorioBundle:Faturamento:listarInativosCsv, idRede: null, dtAcaoInicio: null, dtAcaoFim: null } |
| 168 | 168 | requirements: |
| 169 | - idRede: \d+ | |
| 170 | 169 | \ No newline at end of file |
| 170 | + idRede: \d+ | |
| 171 | + | |
| 172 | +cacic_relatorio_csv_hardware_wmi: | |
| 173 | + pattern: /csv/hardware/{classe} | |
| 174 | + defaults: { _controller: CacicRelatorioBundle:Hardware:csvWMIRelatorio } | |
| 175 | + | |
| 176 | +cacic_relatorio_csv_hardware_wmi_detalhe: | |
| 177 | + pattern: /csv/hardware/{classe}/{propriedade} | |
| 178 | + defaults: { _controller: CacicRelatorioBundle:Hardware:csvWMIRelatorioDetalhe } | |
| 171 | 179 | \ No newline at end of file | ... | ... |
src/Cacic/RelatorioBundle/Resources/views/Hardware/rel_wmi.html.twig
| ... | ... | @@ -5,14 +5,25 @@ |
| 5 | 5 | <h2>{{ 'Relatório de Configurações da Classe '|trans }} {{ classe }}</h2> |
| 6 | 6 | <h5>{{ 'Relatório gerado em'|trans }} {% if idioma == 'pt_BR' %}{{ "now"|date("d/m/Y H\\hi") }}{% else %}{{ "now"|date("m/d/Y H\\hi") }}{% endif %}</h5> |
| 7 | 7 | |
| 8 | + <form id="csv" action="{{ path('cacic_relatorio_csv_hardware_wmi', {'classe': classe}) }}" method="post"> | |
| 9 | + {% for elm, value in filtros %} | |
| 10 | + <input type="hidden" name="{{ elm }}" value="{{ value }}"> | |
| 11 | + {% endfor %} | |
| 12 | + <button class="btn btn-primary" type="submit"> | |
| 13 | + <i class="icon-bar-chart"></i> | |
| 14 | + Gerar CSV | |
| 15 | + </button> | |
| 16 | + </form> | |
| 17 | + | |
| 8 | 18 | <hr /> |
| 9 | 19 | |
| 10 | -<table class="table table-striped table-bordered"> | |
| 20 | + | |
| 21 | +<table class="display datatable" id="datatable"> | |
| 11 | 22 | <thead> |
| 12 | 23 | <tr> |
| 13 | - <th width="10%">{{ "Sistema Operacional"|trans }}</th> | |
| 24 | + <th width="20%">{{ "Sistema Operacional"|trans }}</th> | |
| 14 | 25 | <th width="10%">{{ "Local"|trans }}</th> |
| 15 | - <th width="10%">{{ "Subrede"|trans }}</th> | |
| 26 | + <th width="20%">{{ "Subrede"|trans }}</th> | |
| 16 | 27 | <th width="10%">{{ "Propriedade"|trans }}</th> |
| 17 | 28 | <th width="10%">{{ "Computadores"|trans }}</th> |
| 18 | 29 | <th>{{ "Valor"|trans }}</th> |
| ... | ... | @@ -22,7 +33,7 @@ |
| 22 | 33 | <tbody> |
| 23 | 34 | {% for reg in dados %} |
| 24 | 35 | <tr> |
| 25 | - <td><span class="{% if reg.inMswindows == 'S' %}red{% else %}blue{% endif %}"><a href="{{ path('cacic_relatorio_hardware_wmi_detalhe', {'classe': classe, 'propriedade': reg.nmPropertyName, 'so': reg.idSo}) }}" title="{{ "Lista de computadores"|trans }}" target="_blank">{{ reg.sgSo }}</a></span></td> | |
| 36 | + <td><span class="{% if reg.inMswindows == 'S' %}red{% else %}blue{% endif %}"><a href="{{ path('cacic_relatorio_hardware_wmi_detalhe', {'classe': classe, 'propriedade': reg.nmPropertyName, 'so': reg.idSo}) }}" title="{{ "Lista de computadores"|trans }}" target="_blank">{{ reg.teDescSo }}</a></span></td> | |
| 26 | 37 | <td><a href="{{ path('cacic_relatorio_hardware_wmi_detalhe', {'classe': classe, 'propriedade': reg.nmPropertyName, 'local': reg.idLocal}) }}" title="{{ "Lista de computadores"|trans }}" target="_blank">{{ reg.nmLocal }}</a></td> |
| 27 | 38 | <td><a href="{{ path('cacic_relatorio_hardware_wmi_detalhe', {'classe': classe, 'propriedade': reg.nmPropertyName, 'rede': reg.idRede}) }}" title="{{ "Lista de computadores"|trans }}" target="_blank">{{ reg.nmRede }} / {{ reg.teIpRede }}</a></td> |
| 28 | 39 | <td><a href="{{ path('cacic_relatorio_hardware_wmi_detalhe', {'classe': classe, 'propriedade': reg.nmPropertyName}) }}" title="{{ "Lista de computadores"|trans }}" target="_blank">{{ reg.nmPropertyName }}</a></td> | ... | ... |
src/Cacic/RelatorioBundle/Resources/views/Hardware/rel_wmi_detalhe.html.twig
| ... | ... | @@ -6,9 +6,19 @@ |
| 6 | 6 | <h3>{{ 'Dados relativos à Propriedade '|trans }}{{ propriedade }}</h3> |
| 7 | 7 | <h5>{{ 'Relatório gerado em'|trans }} {% if idioma == 'pt_BR' %}{{ "now"|date("d/m/Y H\\hi") }}{% else %}{{ "now"|date("m/d/Y H\\hi") }}{% endif %}</h5> |
| 8 | 8 | |
| 9 | + <form id="csv" action="{{ path('cacic_relatorio_csv_hardware_wmi_detalhe', { 'classe': classe, 'propriedade': propriedade }) }}" method="post"> | |
| 10 | + {% for elm, value in filtros %} | |
| 11 | + <input type="hidden" name="{{ elm }}" value="{{ value }}"> | |
| 12 | + {% endfor %} | |
| 13 | + <button class="btn btn-primary" type="submit"> | |
| 14 | + <i class="icon-bar-chart"></i> | |
| 15 | + Gerar CSV | |
| 16 | + </button> | |
| 17 | + </form> | |
| 18 | + | |
| 9 | 19 | <hr /> |
| 10 | 20 | |
| 11 | -<table class="table table-striped table-bordered"> | |
| 21 | +<table class="display datatable" id="datatable"> | |
| 12 | 22 | <thead> |
| 13 | 23 | <tr> |
| 14 | 24 | <th width="10%">{{ "Computador"|trans }}</th> | ... | ... |