ComputadorColetaRepository.php 9.83 KB
<?php

namespace Cacic\CommonBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * ComputadorColetaRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ComputadorColetaRepository extends EntityRepository
{
	
	/**
	 * Recupera os dados de coleta referentes ao Computador parametrizado
	 * @param \Cacic\CommonBundle\Entity\Computador $computador
	 */
	public function getDadosColetaComputador( \Cacic\CommonBundle\Entity\Computador $computador )
	{
		$qb = $this->createQueryBuilder('coleta')->select('coleta',
            'propriedade',
            'classe',
            'software.displayName',
            'software.displayVersion',
            'software.URLInfoAbout',
            'software.publisher'
        )
            ->innerJoin('coleta.classProperty', 'propriedade')
            ->innerJoin('propriedade.idClass', 'classe')
            ->leftJoin('CacicCommonBundle:PropriedadeSoftware', 'software', 'WITH', 'propriedade.idClassProperty = software.classProperty')
            ->where('coleta.computador = (:computador)')
            ->setParameter('computador', $computador)
            ->orderBy('classe.nmClassName')
            ->addOrderBy('propriedade.nmPropertyName');
	
		return $qb->getQuery()->execute();
	}

    /**
     *
     * Gera relatório de configurações de hardware coletadas dos computadores
     * @param array $filtros
     */
    public function gerarRelatorioConfiguracoes( $filtros )
    {
        $qb = $this->createQueryBuilder('coleta')
            ->select('IDENTITY(coleta.computador), coleta.teClassPropertyValue, comp.nmComputador, comp.teNodeAddress, comp.teIpComputador, so.idSo, so.inMswindows, so.sgSo, rede.idRede, local.nmLocal, local.idLocal')
            ->innerJoin('coleta.classProperty', 'property')
            ->innerJoin('property.idClass', 'classe')
            ->innerJoin('coleta.computador', 'comp')
            ->innerJoin('comp.idSo', 'so')
            ->innerJoin('comp.idRede', 'rede')
            ->innerJoin('rede.idLocal', 'local');

        /**
         * Verifica os filtros
         */
        if ( array_key_exists('locais', $filtros) && !empty($filtros['locais']) )
            $qb->andWhere('local.idLocal IN (:locais)')->setParameter('locais', explode( ',', $filtros['locais'] ));

        if ( array_key_exists('so', $filtros) && !empty($filtros['so']) )
            $qb->andWhere('comp.idSo IN (:so)')->setParameter('so', explode( ',', $filtros['so'] ));

        if ( array_key_exists('conf', $filtros) && !empty($filtros['conf']) )
        	$qb->andWhere('property.idClass IN (:conf)')->setParameter('conf', explode( ',', $filtros['conf'] ));


        return $qb->getQuery()->execute();
    }

    /*
     *  Retorna lista de atributos coletados para a classe fornecida
     *
     * @param $classe
     *
     */

    public function listarPropriedades($classe) {

        $qb = $this->createQueryBuilder('coleta')
            ->select('DISTINCT IDENTITY(coleta.classProperty) AS idClassProperty, property.nmPropertyName')
            ->innerJoin('coleta.classProperty', 'property')
            ->innerJoin('property.idClass', 'classe')
            ->where('classe.nmClassName = :classe')
            ->orderBy('property.nmPropertyName')
            ->setParameter('classe', $classe);

        return $qb->getQuery()->execute();
    }

    /*
    * Lista das classes que vão para o Menu de relatórios
    *
    * FIXME: Adicionar parâmetro para excluir classes do Menu
    */

    public function menu()
    {
        $_dql = "SELECT c
                FROM CacicCommonBundle:ComputadorColeta coleta
                INNER JOIN CacicCommonBundle:ClassProperty property WITH coleta.classProperty = property.idClassProperty
				INNER JOIN CacicCommonBundle:Classe c WITH property.idClass = c.idClass
				WHERE c.nmClassName NOT IN ('SoftwareList', 'Patrimonio')
				ORDER BY c.nmClassName";

        return $this->getEntityManager()->createQuery( $_dql )->getArrayResult();
    }

    /**
     *
     * Gera relatório de propriedades WMI coletadas dos computadores
     *
     * @param array $filtros
     * @param $classe
     */
    public function gerarRelatorioWMIDetalhe( $filtros, $classe )
    {
        $qb = $this->createQueryBuilder('coleta')
            ->select('IDENTITY(coleta.computador), property.nmPropertyName, coleta.teClassPropertyValue, comp.nmComputador, comp.teNodeAddress, comp.teIpComputador, so.idSo, so.inMswindows, so.sgSo, rede.idRede, rede.nmRede, rede.teIpRede, local.nmLocal, local.idLocal')
            ->innerJoin('coleta.classProperty', 'property')
            ->innerJoin('property.idClass', 'classe')
            ->innerJoin('coleta.computador', 'comp')
            ->innerJoin('comp.idSo', 'so')
            ->innerJoin('comp.idRede', 'rede')
            ->innerJoin('rede.idLocal', 'local')
            ->where('classe.nmClassName = :classe')
            ->setParameter('classe', $classe);

        /**
         * Verifica os filtros
         */
        if ( array_key_exists('locais', $filtros) && !empty($filtros['locais']) )
            $qb->andWhere('local.idLocal IN (:locais)')->setParameter('locais', explode( ',', $filtros['locais'] ));

        if ( array_key_exists('redes', $filtros) && !empty($filtros['redes']) )
            $qb->andWhere('rede.idRede IN (:redes)')->setParameter('redes', explode( ',', $filtros['redes'] ));

        if ( array_key_exists('so', $filtros) && !empty($filtros['so']) )
            $qb->andWhere('comp.idSo IN (:so)')->setParameter('so', explode( ',', $filtros['so'] ));

        if ( array_key_exists('conf', $filtros) && !empty($filtros['conf']) )
            $qb->andWhere('property.nmPropertyName IN (:conf)')->setParameter('conf', explode( ',', $filtros['conf'] ));


        return $qb->getQuery()->execute();
    }

    public function gerarRelatorioSoftware( $filtros, $software, $local )
    {
        $qb = $this->createQueryBuilder('coleta')
            ->select('DISTINCT IDENTITY(coleta.computador), property.nmPropertyName, coleta.teClassPropertyValue, comp.nmComputador, comp.teNodeAddress,
             comp.teIpComputador, so.idSo, so.inMswindows, so.sgSo, rede.idRede, rede.nmRede, rede.teIpRede, local.nmLocal, local.idLocal, comp.dtHrInclusao')
            ->innerJoin('CacicCommonBundle:ComputadorColetaHistorico','hist', 'WITH', 'coleta.idComputadorColeta = hist.computadorColeta')
            ->innerJoin('coleta.classProperty', 'property')
            ->innerJoin('property.idClass', 'classe')
            ->innerJoin('coleta.computador', 'comp')
            ->innerJoin('comp.idSo', 'so')
            ->innerJoin('comp.idRede', 'rede')
            ->innerJoin('rede.idLocal', 'local')
            ->innerJoin('CacicCommonBundle:PropriedadeSoftware', 'prop', 'WITH', 'prop.classProperty = coleta.classProperty')
            ->innerJoin('prop.software', 'soft')
            ->orWhere('property.nmPropertyName = :software')
            ->orWhere('prop.displayName = :software')
            ->setParameter('software', $software);

        /**
         * Verifica os filtros
         */
        if (!empty($local))
            $qb->andWhere('local.nmLocal IN (:local)')->setParameter('local', $local);

        if ( array_key_exists('local', $filtros) && !empty($filtros['local']) )
            $qb->andWhere('local.idLocal IN (:locais)')->setParameter('locais', explode( ',', $filtros['locais'] ));

        if ( array_key_exists('redes', $filtros) && !empty($filtros['redes']) )
            $qb->andWhere('rede.idRede IN (:redes)')->setParameter('redes', explode( ',', $filtros['redes'] ));

        if ( array_key_exists('so', $filtros) && !empty($filtros['so']) )
            $qb->andWhere('comp.idSo IN (:so)')->setParameter('so', explode( ',', $filtros['so'] ));

        if ( array_key_exists('conf', $filtros) && !empty($filtros['conf']) )
            $qb->andWhere('property.idClassProperty IN (:conf)')->setParameter('conf', explode( ',', $filtros['conf'] ));


        return $qb->getQuery()->execute();
    }

    /**
     *
     * Gera relatório de propriedades WMI coletadas dos computadores detalhado
     *
     * @param array $filtros
     * @param $classe
     */
    public function gerarRelatorioWMI( $filtros, $classe )
    {
        $qb = $this->createQueryBuilder('coleta')
            ->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')
            ->innerJoin('coleta.classProperty', 'property')
            ->innerJoin('property.idClass', 'classe')
            ->innerJoin('coleta.computador', 'comp')
            ->innerJoin('comp.idSo', 'so')
            ->innerJoin('comp.idRede', 'rede')
            ->innerJoin('rede.idLocal', 'local')
            ->where('classe.nmClassName = :classe')
            ->groupBy('property.nmPropertyName, coleta.teClassPropertyValue, so.idSo, so.inMswindows,so.sgSo, rede.idRede, rede.nmRede, rede.teIpRede, local.nmLocal, local.idLocal')
            ->setParameter('classe', $classe);

        /**
         * Verifica os filtros
         */
        if ( array_key_exists('locais', $filtros) && !empty($filtros['locais']) )
            $qb->andWhere('local.idLocal IN (:locais)')->setParameter('locais', explode( ',', $filtros['locais'] ));

        if ( array_key_exists('redes', $filtros) && !empty($filtros['redes']) )
            $qb->andWhere('rede.idRede IN (:redes)')->setParameter('redes', explode( ',', $filtros['redes'] ));

        if ( array_key_exists('so', $filtros) && !empty($filtros['so']) )
            $qb->andWhere('comp.idSo IN (:so)')->setParameter('so', explode( ',', $filtros['so'] ));

        if ( array_key_exists('conf', $filtros) && !empty($filtros['conf']) )
            $qb->andWhere('property.idClassProperty IN (:conf)')->setParameter('conf', explode( ',', $filtros['conf'] ));


        return $qb->getQuery()->execute();
    }
}