/**
  * Retorna os dados para a emissão da nfse
  *
  * @param string $sCodigoVerificacao
  * @param object $oNota
  * @param object $oPrefeitura
  * @return array
  */
 public static function getDadosEmissao($sCodigoVerificacao, $oNota, $oPrefeitura)
 {
     /**
      * Verifica se os dados foram enviados pela verificar de autenticidade sem nescessidade de estar logado ao sistema
      */
     if ($oNota->getId_contribuinte()) {
         $oPrestador = Contribuinte_Model_Contribuinte::getById($oNota->getId_contribuinte());
     } else {
         $oPrestador = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($oNota->getP_im());
     }
     $oBaseUrlHelper = new Zend_View_Helper_BaseUrl();
     $oServerUrlHelper = new Zend_View_Helper_ServerUrl();
     // Calcula e divide a quantidade de páginas conforme os dados descritos no campo de 'Descrição do Serviço'
     $iTamanhoTotalTexto = strlen($oNota->getS_dados_discriminacao());
     $iQndPaginas = $iTamanhoTotalTexto > 800 ? 2 : 1;
     $aDados = array();
     // Quebra os modelos de nota em páginas conforme os dados descritos no campo de 'Descrição do Serviço'
     for ($iIndex = 1; $iIndex <= $iQndPaginas; $iIndex++) {
         // Dados de manipulação do cabeçalho
         $oDadosCabecalho = new StdClass();
         $oDadosCabecalho->sBrasao = $oBaseUrlHelper->baseUrl('/global/img/brasao.jpg');
         $oDadosCabecalho->oDadosPrefeitura = $oPrefeitura;
         if (getenv('APPLICATION_ENV') != 'production') {
             $oDadosCabecalho->sUrlTarja = $oBaseUrlHelper->baseUrl('/administrativo/img/nfse/tarja_sem_valor.png');
         } else {
             if ($oNota->getIdNotaSubstituta()) {
                 $oDadosCabecalho->sUrlTarja = $oBaseUrlHelper->baseUrl('/administrativo/img/nfse/tarja_substituida.gif');
             } else {
                 if ($oNota->getCancelada()) {
                     $oDadosCabecalho->sUrlTarja = $oBaseUrlHelper->baseUrl('/administrativo/img/nfse/tarja_cancelada.gif');
                 }
             }
         }
         // Gera o QRCode apenas para os modelos que exibem o mesmo
         if (in_array($oPrefeitura->getModeloImpressaoNfse(), array(2, 3))) {
             $aVerificacao = array('module' => 'auth', 'controller' => 'nfse', 'action' => 'autenticar-post', 'prestador_cnpjcpf' => $oNota->getP_cnpjcpf(), 'codigo_verificacao' => $sCodigoVerificacao);
             $sUrlVerificada = DBSeller_Helper_Url_Encrypt::encrypt(array('module' => 'default', 'controller' => 'index', 'action' => 'autentica', 'url' => $aVerificacao));
             //"codigo_verificacao/{$sCodigoVerificacao}/prestador_cnpjcpf/{$oNota->getP_cnpjcpf()}"));
             $sQRCodeImagem = DBSeller_Helper_QRCode_QRCode::getQrCodeNfse($sUrlVerificada, $sCodigoVerificacao);
             $oDadosCabecalho->sQRCode = $oBaseUrlHelper->baseUrl("/tmp/{$sQRCodeImagem}");
         }
         // Dados de manipulação do prestador
         $oDadosPrestador = new StdClass();
         $oDadosPrestador->oPrestador = $oPrestador;
         $sLogoPrestador = Administrativo_Model_Empresa::getLogoByIm($oNota->getP_im());
         $oDadosPrestador->sLogoPrestador = $oBaseUrlHelper->baseUrl("/tmp/{$sLogoPrestador}");
         // Dados de manipulação do serviço
         $oDadosServico = new StdClass();
         $oDadosServico->oDadosNota = $oNota;
         // Verifica se não é a primeira página que será impressa e quebra as demais 'Descrição do Serviço'
         $iInicioCaracterPagina = 0;
         $iQndCaracterPagina = 800;
         if ($iIndex == 2) {
             $iInicioCaracterPagina = 800;
             $iQndCaracterPagina = $iTamanhoTotalTexto;
         }
         $sDiscriminacaoServico = substr($oNota->getS_dados_discriminacao(), $iInicioCaracterPagina, $iQndCaracterPagina);
         $oDadosServico->sDiscriminacaoServico = $sDiscriminacaoServico;
         // Dados de manipulação da nota subtstituida
         $iIdNotaSubstituida = $oNota->getIdNotaSubstituida();
         if ($iIdNotaSubstituida) {
             $oDadosServico->oDadosNotaSubstituida = Contribuinte_Model_Nota::getById($iIdNotaSubstituida);
         }
         $oRegistro = new StdClass();
         $oRegistro->iPagina = $iIndex;
         $oRegistro->oDadosCabecalho = $oDadosCabecalho;
         $oRegistro->oDadosPrestador = $oDadosPrestador;
         $oRegistro->oDadosServico = $oDadosServico;
         $aDados[] = $oRegistro;
     }
     return $aDados;
 }
 /**
  * Acao Salvar DMS
  *
  * @return boolean
  */
 public function emissaoManualSaidaSalvarAction()
 {
     // Perfil do usuario logado
     $iIdPerfil = $this->oUsuario->getPerfil()->getId();
     // Dados Request
     $aDados = $this->getRequest()->getParams();
     // Prestador eventual
     if ($iIdPerfil == 6) {
         $oForm = new Contribuinte_Form_DmsSaidaEventual();
     } else {
         $oForm = new Contribuinte_Form_DmsSaida();
     }
     // Popula o formulario
     $oForm->populate($aDados);
     // Valida o formulario
     if ($oForm->isValid($aDados)) {
         // Verifica se ja existe uma nota com o numero e se tem AIDOF
         self::emissaoManualSaidaVerificarDocumentoAction();
         // Valida se a data da nota esta no mes corrente
         $oValidaDataNota = new DBSeller_Validator_DateCurrentMonth();
         $oValidaDataNota->setMes($aDados['mes_comp']);
         $oValidaDataNota->setAno($aDados['ano_comp']);
         if (!$oValidaDataNota->isValid($aDados['s_nota_data'])) {
             $aErros = $oValidaDataNota->getMessages();
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['error'][] = $aErros[$oValidaDataNota::COMPETENCIA_INVALIDA];
             echo $this->getHelper('json')->sendJson($aRetornoJson);
             exit;
         }
         // Aplica filtro de mascaras
         $aDados['s_cpf_cnpj'] = $oForm->s_cpf_cnpj->getValue();
         // SALVAR DADOS DA DMS (INI)
         if (isset($aDados['id_dms']) && !empty($aDados['id_dms'])) {
             $oDms = Contribuinte_Model_Dms::getById($aDados['id_dms']);
         } else {
             $oDms = new Contribuinte_Model_Dms();
             $oDms->setAnoCompetencia($aDados['ano_comp']);
             $oDms->setMesCompetencia($aDados['mes_comp']);
             $oDms->setOperacao(Contribuinte_Model_Dms::SAIDA);
         }
         if (!is_object($oDms)) {
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['error'][] = $this->translate->_('Código DMS não encontrado.');
             echo $this->getHelper('json')->sendJson($aRetornoJson);
             exit;
         }
         $oDms->setIdContribuinte($this->oContribuinte->getIdUsuarioContribuinte());
         $oDms->setIdUsuario($this->usuarioLogado->getId());
         $oDms->setDataOperacao(new DateTime());
         $oDms->setStatus('aberto');
         // SALVAR DADOS DA DMS (FIM)
         // SALVAR DADOS DA NOTA (INI)
         if (isset($aDados['id']) && !empty($aDados['id'])) {
             $oDmsNota = Contribuinte_Model_DmsNota::getById($aDados['id']);
         } else {
             $oDmsNota = new Contribuinte_Model_DmsNota();
         }
         if (!is_object($oDmsNota)) {
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['error'][] = $this->translate->_('Código Dms Nota não encontrado.');
             echo $this->getHelper('json')->sendJson($aRetornoJson);
             exit;
         }
         // Dados Nota
         $oDataNota = new DateTime(str_replace('/', '-', $aDados['s_nota_data']));
         $oDataNota->format('Y-m-d');
         $oDmsNota->setNotaNumero($aDados['s_nota']);
         $oDmsNota->setNotaSerie($aDados['s_nota_serie']);
         $oDmsNota->setNotaData($oDataNota);
         $oDmsNota->setSituacaoDocumento($aDados['situacao_documento']);
         $oDmsNota->setNaturezaOperacao($aDados['natureza_operacao']);
         $oDmsNota->setEmiteGuia(TRUE);
         $oDmsNota->setServicoImpostoRetido(FALSE);
         // Verifica o flag para substituição tributária
         if (isset($aDados['s_imposto_retido']) && $aDados['s_imposto_retido'] == 1) {
             $oDmsNota->setServicoImpostoRetido(TRUE);
         }
         // Prestador eventual
         if ($iIdPerfil != 6) {
             $oGrupoDocumento = Contribuinte_Model_Nota::getTipoNota($aDados['tipo_documento']);
             $oDmsNota->setGrupoDocumento($oGrupoDocumento->codigo_grupo);
             $oDmsNota->setTipoDocumento($aDados['tipo_documento']);
             /*
              * Verifica se emite guia:
              *   Se a natureza da operacao for 2 (fora da prefeitura) não emite guia
              *   Se for substituto tributário (retido pelo tomador) não emite guia
              */
             if ($aDados['natureza_operacao'] == 2 || $aDados['s_imposto_retido']) {
                 $oDmsNota->setEmiteGuia(FALSE);
             } else {
                 // Configura o parametro para emitir a guia
                 $oChecaEmissaoGuiaStdClass = new stdClass();
                 $oChecaEmissaoGuiaStdClass->data = $aDados['s_nota_data'];
                 $oChecaEmissaoGuiaStdClass->inscricao_municipal = $this->oContribuinte->getInscricaoMunicipal();
                 $oDmsNota->setEmiteGuia(Contribuinte_Model_EmissorGuia::checarEmissaoGuia($oChecaEmissaoGuiaStdClass));
             }
         } else {
             $oDmsNota->setTipoDocumentoDescricao($aDados['tipo_documento_descricao']);
         }
         // Dados Servico
         $oDataServico = new DateTime(str_replace('/', '-', $aDados['s_data']));
         $oDataServico->format('Y-m-d');
         // Formatando dados
         $sServicoValorPagar = DBSeller_Helper_Number_Format::toFloat($aDados['s_valor_bruto']);
         $sServicoValorDeducao = DBSeller_Helper_Number_Format::toFloat($aDados['s_valor_deducao']);
         $sServicoValorCondicionado = DBSeller_Helper_Number_Format::toFloat($aDados['s_vl_condicionado']);
         $sServicoDescontoIncondicionado = DBSeller_Helper_Number_Format::toFloat($aDados['s_vl_desc_incondicionado']);
         $sServicoAliquota = DBSeller_Helper_Number_Format::toFloat($aDados['s_aliquota']);
         $sServicoBaseCalculo = DBSeller_Helper_Number_Format::toFloat($aDados['s_base_calculo']);
         $sServicoValorImposto = DBSeller_Helper_Number_Format::toFloat($aDados['s_valor_imposto']);
         $sServicoValorLiquido = DBSeller_Helper_Number_Format::toFloat($aDados['s_valor_pagar']);
         // Populando o documento de dms
         $oDmsNota->setNumpre(0);
         $oDmsNota->setServicoData($oDataServico);
         $oDmsNota->setServicoImpostoRetido($aDados['s_imposto_retido']);
         $oDmsNota->setServicoValorPagar($sServicoValorPagar);
         $oDmsNota->setServicoValorDeducao($sServicoValorDeducao);
         $oDmsNota->setServicoValorCondicionado($sServicoValorCondicionado);
         $oDmsNota->setServicoDescontoIncondicionado($sServicoDescontoIncondicionado);
         $oDmsNota->setServicoAliquota($sServicoAliquota);
         $oDmsNota->setServicoBaseCalculo($sServicoBaseCalculo);
         $oDmsNota->setServicoValorImposto($sServicoValorImposto);
         $oDmsNota->setServicoValorLiquido($sServicoValorLiquido);
         $oDmsNota->setServicoCodigoCnae($aDados['s_dados_cod_cnae']);
         $oDmsNota->setServicoCodigoServico($aDados['s_servico_prestado']);
         $oDmsNota->setDescricaoServico($aDados['s_observacao']);
         $oDmsNota->setServicoCodigoObra($aDados['s_codigo_obra']);
         $oDmsNota->setServicoArt($aDados['s_art']);
         $oDmsNota->setServicoInformacoesComplementares($aDados['s_informacoes_complementares']);
         // Dados Prestador eventual
         if ($iIdPerfil == 6) {
             $oDadosPrestador = Contribuinte_Model_ContribuinteEventual::getById($this->oContribuinte->getIdUsuarioContribuinte());
             // Salva o código CNAE do serviço quando for prestador eventual
             $aServicoPrestado = Contribuinte_Model_Servico::getByCodServico($aDados['s_servico_prestado'], FALSE);
             $oServicoPrestado = is_array($aServicoPrestado) ? reset($aServicoPrestado) : $aServicoPrestado;
             $oDmsNota->setServicoCodigoCnae($oServicoPrestado->attr('estrut_cnae'));
         } else {
             $oDadosPrestador = Contribuinte_Model_Contribuinte::getById($this->oContribuinte->getIdUsuarioContribuinte());
         }
         $oDmsNota->setPrestadorCpfCnpj($oDadosPrestador->getCgcCpf());
         $oDmsNota->setPrestadorInscricaoMunicipal($oDadosPrestador->getInscricaoMunicipal());
         $oDmsNota->setPrestadorInscricaoEstadual($oDadosPrestador->getInscricaoEstadual());
         $oDmsNota->setPrestadorRazaoSocial($oDadosPrestador->getNome());
         $oDmsNota->setPrestadorNomeFantasia($oDadosPrestador->getNomeFantasia());
         $oDmsNota->setPrestadorEnderecoRua($oDadosPrestador->getDescricaoLogradouro());
         $oDmsNota->setPrestadorEnderecoNumero($oDadosPrestador->getLogradouroNumero());
         $oDmsNota->setPrestadorEnderecoComplemento($oDadosPrestador->getLogradouroComplemento());
         $oDmsNota->setPrestadorEnderecoBairro($oDadosPrestador->getLogradouroBairro());
         $oDmsNota->setPrestadorEnderecoCodigoMunicipio($oDadosPrestador->getCodigoIbgeMunicipio());
         $oDmsNota->setPrestadorEnderecoEstado($oDadosPrestador->getEstado());
         $oDmsNota->setPrestadorEnderecoCodigoPais($oDadosPrestador->getCodigoPais());
         $oDmsNota->setPrestadorEnderecoCEP($oDadosPrestador->getCep());
         $oDmsNota->setPrestadorTelefone($oDadosPrestador->getTelefone());
         $oDmsNota->setPrestadorEmail($oDadosPrestador->getEmail());
         $oDmsNota->setIdUsuario($this->usuarioLogado->getId());
         $oDmsNota->setIdContribuinte($this->oContribuinte->getIdUsuarioContribuinte());
         // Dados Tomador
         if ($aDados['s_cpf_cnpj'] != NULL) {
             $oDadosTomador = Contribuinte_Model_Empresa::getByCgcCpf($aDados['s_cpf_cnpj']);
         }
         if ($aDados['s_imposto_retido'] && (!isset($oDadosTomador) || !isset($oDadosTomador->eCidade))) {
             $sMensagem = 'Tomador com CPF/CNPJ %s não cadastrado.';
             $sMensagemParametro = '"<b>' . $this->getRequest()->getParam('s_cpf_cnpj') . '</b>"';
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['fields'] = array_keys($oForm->getMessages());
             $aRetornoJson['error'][] = sprintf($this->translate->_($sMensagem), $sMensagemParametro);
             echo $this->getHelper('json')->sendJson($aRetornoJson);
             exit;
         }
         if (isset($oDadosTomador) && is_object($oDadosTomador) && isset($oDadosTomador->eCidade)) {
             $oDadosTomadorEcidade = $oDadosTomador->eCidade[0];
             $oDmsNota->setTomadorCpfCnpj($aDados['s_cpf_cnpj']);
             $oDmsNota->setTomadorNomeFantasia($oDadosTomadorEcidade->attr('nome_fanta'));
             $oDmsNota->setTomadorRazaoSocial($oDadosTomadorEcidade->attr('nome'));
             $oDmsNota->setTomadorInscricaoMunicipal($oDadosTomadorEcidade->attr('inscricao'));
             $oDmsNota->setTomadorInscricaoEstadual($oDadosTomadorEcidade->attr('inscr_est'));
             $oDmsNota->setTomadorEnderecoRua($oDadosTomadorEcidade->attr('endereco'));
             $oDmsNota->setTomadorEnderecoNumero($oDadosTomadorEcidade->attr('numero'));
             $oDmsNota->setTomadorEnderecoComplemento($oDadosTomadorEcidade->attr('complemento'));
             $oDmsNota->setTomadorEnderecoBairro($oDadosTomadorEcidade->attr('bairro'));
             $oDmsNota->setTomadorEnderecoCodigoMunicipio($oDadosTomadorEcidade->attr('cod_ibge'));
             $oDmsNota->setTomadorEnderecoEstado($oDadosTomadorEcidade->attr('uf'));
             $oDmsNota->setTomadorEnderecoCodigoPais($oDadosTomadorEcidade->attr('cod_pais'));
             $oDmsNota->setTomadorEnderecoCEP($oDadosTomadorEcidade->attr('cep'));
             $oDmsNota->setTomadorTelefone($oDadosTomadorEcidade->attr('telefone'));
             $oDmsNota->setTomadorEmail($oDadosTomadorEcidade->attr('email'));
         } else {
             if ($aDados['s_cpf_cnpj'] && (!isset($oDadosTomador) || !isset($oDadosTomador->eNota))) {
                 $oDadosTomadorNFSE = new Contribuinte_Model_EmpresaBase();
                 $aDadosTomador['t_cnpjcpf'] = $aDados['s_cpf_cnpj'];
                 $aDadosTomador['t_razao_social'] = $aDados['s_razao_social'];
                 $oDadosTomadorNFSE->persist($aDadosTomador);
             }
             $oDmsNota->setTomadorInscricaoMunicipal($aDados['s_inscricao_municipal']);
             $oDmsNota->setTomadorCpfCnpj($aDados['s_cpf_cnpj']);
             $oDmsNota->setTomadorRazaoSocial($aDados['s_razao_social']);
         }
         // Vincula o DMS ao documento
         $oDmsNota->setDms($oDms->getEntity());
         // Adiciona o documento ao DMS
         $oDms->addDmsNotas($oDmsNota->getEntity());
         // Salva o DMS e o Documento
         $iCodigoDms = $oDms->persist();
         // Configura a mensagem de sucesso
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['success'] = $this->translate->_('Documento lançado com sucesso!');
         $aRetornoJson['id_dms'] = $iCodigoDms;
         // Configura a mensagem para edição
         if (isset($aDados['id']) && $aDados['id']) {
             $aRetornoJson['success'] = $this->translate->_('Documento alterado com sucesso!');
             $aRetornoJson['url'] = $this->view->baseUrl("/contribuinte/dms/emissao-manual-saida/id_dms/{$iCodigoDms}");
         }
     } else {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['fields'] = array_keys($oForm->getMessages());
         $aRetornoJson['error'][] = $this->translate->_('Preencha os dados corretamente.');
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Retorna a Instância do contribuinte
  * @return Contribuinte_Model_ContribuinteAbstract
  */
 public static function getContribuinte($iCodigoContribuinte)
 {
     $oContribuinte = Administrativo_Model_UsuarioContribuinte::getById($iCodigoContribuinte);
     $iCodigoUsuario = $oContribuinte->getId();
     $oUsuarioRetorno = NULL;
     switch ($oContribuinte->getTipoContribuinte()) {
         case Administrativo_Model_UsuarioContribuinte::CONTRIBUINTE_EVENTUAL:
             $oUsuarioRetorno = Contribuinte_Model_ContribuinteEventual::getById($iCodigoUsuario);
             break;
         case Administrativo_Model_UsuarioContribuinte::CONTRIBUINTE_MUNICIPAL:
             $oUsuarioRetorno = Contribuinte_Model_Contribuinte::getById($iCodigoUsuario);
             break;
     }
     return $oUsuarioRetorno;
 }
 /**
  * Prepara os dados para processar o arquivo do webservice
  *
  * @param string $sArquivo
  * @return bool
  * @throws Exception
  */
 public function preparaDados($sArquivo)
 {
     try {
         // Foi comentado o if de verificação pois estava ocorrendo um problema na emissão e retornava um arquivo em branco.
         // Somente em ambiente de desenvolvimento
         //if (APPLICATION_ENV == 'development') {
         $oDomDocument = new DOMDocument();
         $oDomDocument->loadXml($sArquivo);
         $oData = new Zend_Date();
         $this->sNomeArquivo = "/RecepcionarLote-{$oData->getTimestamp()}.xml";
         $this->sCaminhoArquivo = TEMP_PATH;
         /**
          * Verifica se o caminho do arquivo não existe recria a pasta
          */
         if (!file_exists($this->sCaminhoArquivo)) {
             mkdir($this->sCaminhoArquivo, 0777);
         }
         /**
          * Escreve os dados no arquivo
          */
         $this->sCaminhoNomeArquivo = $this->sCaminhoArquivo . $this->sNomeArquivo;
         $aArquivo = fopen($this->sCaminhoNomeArquivo, 'w');
         fputs($aArquivo, print_r($sArquivo, TRUE));
         fclose($aArquivo);
         //}
         $oValidacao = new DBSeller_Helper_Xml_AssinaturaDigital($sArquivo);
         /**
          * Validação digital do arquivo
          */
         if (!$oValidacao->validar()) {
             throw new Exception($oValidacao->getLastError());
         }
         $oUsuario = Administrativo_Model_Usuario::getByAttribute('cnpj', $oValidacao->getCnpj());
         if (!is_object($oUsuario)) {
             throw new Exception('Usuário contribuinte não existe!', 157);
         }
         /**
          * Busca usuário contribuinte através do usuário cadastrado
          */
         $aUsuarioContribuinte = Administrativo_Model_UsuarioContribuinte::getByAttributes(array('usuario' => $oUsuario->getId(), 'cnpj_cpf' => $oUsuario->getCnpj()));
         if (!is_object($aUsuarioContribuinte[0])) {
             throw new Exception('Usuário contribuinte não encontrado!', 160);
         }
         /**
          * Seta os dados do contribuinte
          */
         $this->oDadosUsuario = $oUsuario;
         $this->oContribuinte->sCpfCnpj = $aUsuarioContribuinte[0]->getCnpjCpf();
         $this->oContribuinte->iCodigoUsuario = $oUsuario->getId();
         $this->oContribuinte->iIdUsuarioContribuinte = $aUsuarioContribuinte[0]->getId();
         /**
          * Atualiza os dados do contribuinte na sessão
          */
         $oSessao = new Zend_Session_Namespace('nfse');
         $oSessao->contribuinte = Contribuinte_Model_Contribuinte::getById($this->oContribuinte->iIdUsuarioContribuinte);
         return TRUE;
     } catch (Exception $oErro) {
         throw new Exception($oErro->getMessage(), $oErro->getCode());
     }
 }
 /**
  * Consulta todas as guias dos contribuintes por competência
  * @param $iMes
  * @param $iAno
  * @return array
  */
 public static function getByGuiasContribuinteAndCompetencia($iMes, $iAno)
 {
     $oEntityManager = self::getEm();
     $sSql = 'SELECT nota.id_contribuinte,
                           nota.ano_comp, nota.mes_comp,
                           SUM(nota.s_vl_iss) AS s_vl_iss , SUM(nota.s_vl_servicos) AS s_vl_servicos
                      FROM Contribuinte\\Nota nota
                     WHERE nota.mes_comp           = :mes_comp AND
                           nota.ano_comp           = :ano_comp AND
                           nota.cancelada          = false AND
                           nota.s_vl_iss           > 0 AND
                           nota.s_dados_iss_retido = 1 AND
                           nota.emite_guia         = true AND
                           nota.importada          = false AND
                           NOT EXISTS(SELECT 1
                                        FROM Contribuinte\\Guia guia
                                       WHERE guia.mes_comp = :mes_comp
                                         AND guia.ano_comp = :ano_comp
                                         AND guia.id_contribuinte = nota.id_contribuinte)
                  GROUP BY nota.id_contribuinte, nota.ano_comp, nota.mes_comp
                  ORDER BY nota.ano_comp,
                           nota.mes_comp DESC';
     $oQuery = $oEntityManager->createQuery($sSql);
     $oQuery->setParameter('mes_comp', $iMes);
     $oQuery->setParameter('ano_comp', $iAno);
     $aResultados = $oQuery->getResult();
     $aRetorno = array();
     foreach ($aResultados as $aGuiaCompetencia) {
         $oContribuinte = Contribuinte_Model_Contribuinte::getById($aGuiaCompetencia['id_contribuinte']);
         $oCompetencia = new Contribuinte_Model_Competencia($aGuiaCompetencia['ano_comp'], $aGuiaCompetencia['mes_comp'], $oContribuinte);
         $oCompetencia->setTotalIss($aGuiaCompetencia['s_vl_iss']);
         $oCompetencia->setTotalServico($aGuiaCompetencia['s_vl_servicos']);
         $lExisteGuia = Contribuinte_Model_Guia::existeGuia($oContribuinte, $aGuiaCompetencia['mes_comp'], $aGuiaCompetencia['ano_comp']);
         if ($lExisteGuia) {
             continue;
         }
         $aRetorno[] = $oCompetencia;
     }
     unset($aResultados);
     return $aRetorno;
 }