public function setSoftwareElement($software, $valor, $computador, $classObject) { $logger = $this->get('logger'); $em = $this->getDoctrine()->getManager(); if (empty($software)) { $logger->error("COLETA: Erro na coleta de software. Elemento nulo {$software}"); return false; } try { // FIX: alteração para igualar os campos nome do software e descrição $idSoftware = $software; if (array_key_exists('description', $valor)) { $software = $valor['description']; } // Recupera classProperty para o software $classProperty = $em->getRepository('CacicCommonBundle:ClassProperty')->findOneBy(array('idClass' => $classObject, 'nmPropertyName' => $idSoftware)); if (empty($classProperty)) { $classProperty = new ClassProperty(); $classProperty->setTePropertyDescription("Software detectado: {$software}"); $classProperty->setNmPropertyName($idSoftware); $classProperty->setIdClass($classObject); $classProperty->setAtivo(true); // Se não der o flush aqui, as consultas de baixo não encontram o objeto $em->persist($classProperty); $em->flush(); } $ativo = $classProperty->getAtivo(); //$logger->debug("11111111111111111111111111111111111111111: |$ativo| |$propriedade|"); if ($ativo === false) { // Só vou gravar o software se a propriedade estiver ativa $logger->debug("COLETA: Pulando software inativo: {$software}"); return false; } // Eduardo: 2015-08-06 // A propriedade passa a ser um identificador para o Software $softwareObject = $em->getRepository('CacicCommonBundle:Software')->getByNameOrProperty($software, $classProperty->getIdClassProperty()); if (empty($softwareObject)) { // Se nao existir, cria $logger->info("COLETA: Cadastrando software não encontrado {$software}"); $softwareObject = new Software(); $softwareObject->setNmSoftware($software); $softwareObject->setIdClassProperty($classProperty); // Se não der o flush aqui, as consultas de baixo não encontram o objeto $em->persist($softwareObject); $em->flush(); } // Adiciona software ao computador $propSoftware = $em->getRepository('CacicCommonBundle:PropriedadeSoftware')->findOneBy(array('classProperty' => $classProperty, 'computador' => $computador, 'software' => $softwareObject)); if (empty($propSoftware)) { $propSoftware = new PropriedadeSoftware(); $propSoftware->setComputador($computador); $propSoftware->setSoftware($softwareObject); $propSoftware->setClassProperty($classProperty); } // Garante que o software deve estar ativo $propSoftware->setAtivo(true); $propSoftware->setDataExclusao(null); // Encontra coleta já feita para o Computador $computadorColeta = $em->getRepository('CacicCommonBundle:ComputadorColeta')->findOneBy(array('computador' => $computador, 'classProperty' => $classProperty)); if (empty($computadorColeta)) { //$logger->debug("COLETA: Registrando nova coleta para o software $software no computador ".$computador->getIdComputador()); // Armazena no banco o objeto $computadorColeta = new ComputadorColeta(); $computadorColeta->setComputador($computador); $computadorColeta->setClassProperty($classProperty); $computadorColeta->setTeClassPropertyValue($software); $computadorColeta->setIdClass($classObject); $computadorColeta->setDtHrInclusao(new \DateTime()); $computadorColeta->setAtivo(true); $computadorColeta->setDtHrExclusao(null); $em->persist($computadorColeta); // Pega novo computador gerado no computador coleta $computador = $computadorColeta->getComputador(); // Gravo um histórico $computadorColetaHistorico = new ComputadorColetaHistorico(); $computadorColetaHistorico->setComputadorColeta($computadorColeta); $computadorColetaHistorico->setComputador($computador); $computadorColetaHistorico->setClassProperty($classProperty); $computadorColetaHistorico->setTeClassPropertyValue($software); $computadorColetaHistorico->setDtHrInclusao(new \DateTime()); $em->persist($computadorColetaHistorico); } elseif ($computadorColeta->getTeClassPropertyValue() != $software) { // Armazena no banco o objeto $computadorColeta->setComputador($computador); $computadorColeta->setClassProperty($classProperty); $computadorColeta->setTeClassPropertyValue($software); $computadorColeta->setIdClass($classObject); $computadorColeta->setDtHrInclusao(new \DateTime()); $computadorColeta->setAtivo(true); $computadorColeta->setDtHrExclusao(null); $em->persist($computadorColeta); // Pega novo computador gerado no computador coleta $computador = $computadorColeta->getComputador(); // Aqui é necessário uma entrada no histórico $computadorColetaHistorico = new ComputadorColetaHistorico(); $computadorColetaHistorico->setComputadorColeta($computadorColeta); $computadorColetaHistorico->setComputador($computador); $computadorColetaHistorico->setClassProperty($classProperty); $computadorColetaHistorico->setTeClassPropertyValue($software); $computadorColetaHistorico->setDtHrInclusao(new \DateTime()); $em->persist($computadorColetaHistorico); } // Atualiza valores do Software // $softwareObject->setNmSoftware($software); if (array_key_exists('description', $valor)) { $softwareObject->setTeDescricaoSoftware($valor['description']); $propSoftware->setDisplayName($valor['description']); $classProperty->setPrettyName($valor['description']); } /* if (array_key_exists('name', $valor)) { $classProperty->setNmPropertyName($valor['name']); } */ if (array_key_exists('url', $valor)) { $propSoftware->setUrlInfoAbout($valor['url']); } if (array_key_exists('version', $valor)) { $propSoftware->setDisplayVersion($valor['version']); } if (array_key_exists('publisher', $valor)) { $propSoftware->setPublisher($valor['publisher']); } // Persiste os objetos $em->persist($propSoftware); // Tem que adicionar isso aqui ou o Doctrine vai duplicar o software $em->flush(); } catch (ORMException $e) { // Reopen Entity Manager if (!$em->isOpen()) { // reset the EM and all alias $container = $this->container; $container->set('doctrine.orm.entity_manager', null); $container->set('doctrine.orm.default_entity_manager', null); } $logger->error("COLETA: Erro na inserçao de dados do software {$software}."); $logger->debug($e); return false; } catch (DBALException $e) { // Reopen Entity Manager if (!$em->isOpen()) { // reset the EM and all alias $container = $this->container; $container->set('doctrine.orm.entity_manager', null); $container->set('doctrine.orm.default_entity_manager', null); } $logger->error("COLETA: Erro impossível de software repetido para {$software}."); $logger->debug($e); return false; } return true; }