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> | ... | ... |