/**
  * Gera a guia do prestador no eCidade
  *
  * @param                                $oContribuinte
  * @param Contribuinte_Model_Competencia $oCompetencia
  * @param DateTime                       $oDataPagamento
  * @param bool                           $lGerarPdf
  * @return mixed
  */
 public static function gerarGuiaNFSE($oContribuinte, Contribuinte_Model_Competencia $oCompetencia, DateTime $oDataPagamento, $lGerarPdf = TRUE)
 {
     try {
         $iMesCompetencia = $oCompetencia->getMesComp();
         $iAnoCompetencia = $oCompetencia->getAnoComp();
         $aNotas = $oCompetencia->getNotas();
         $sDataPagamento = $oDataPagamento->format('d/m/Y');
         $oUsuarioContribuinte = Administrativo_Model_UsuarioContribuinte::getById($oContribuinte->getIdUsuarioContribuinte());
         $oDoctrine = Zend_Registry::get('em');
         $oDoctrine->getConnection()->beginTransaction();
         // Salva guia antes de ser gerada
         $oGuia = new Contribuinte_Model_Guia();
         $oGuia->gerarGuiaPrestador($oContribuinte, $oCompetencia, $oDataPagamento);
         $oGuiaGerar = self::montaDadosGuia($oUsuarioContribuinte, $iAnoCompetencia, $iMesCompetencia, $aNotas, $sDataPagamento, $oGuia->getId());
         $oGuiaGerada = NULL;
         $oGuiaGerada = self::gerarGuia($oGuiaGerar, $sDataPagamento, Contribuinte_Model_GuiaEcidade::TIPO_DEBITO_VARIAVEL);
         // Complementa a guia com os dados retornados do webservice
         $oGuia->complementaGuiaPrestador($oGuiaGerada);
         if ($lGerarPdf) {
             $oGuiaGerada->arquivo_guia = Contribuinte_Model_GuiaEcidade::salvarPdf($oGuiaGerada->debito->dados_boleto->arquivo_guia, 'guia_substituto');
         }
         $oDoctrine->getConnection()->commit();
         return $oGuiaGerada;
     } catch (Exception $oError) {
         $oDoctrine->getConnection()->rollback();
         throw new Exception($oError->getMessage());
     }
 }
 /**
  * Monta a tela para emissão do RPS
  *
  * @return void
  */
 public function indexAction()
 {
     try {
         $aDados = $this->getRequest()->getParams();
         $oContribuinte = $this->_session->contribuinte;
         $this->view->empresa_nao_prestadora = FALSE;
         $this->view->empresa_nao_emissora_nfse = FALSE;
         $this->view->bloqueado_msg = FALSE;
         $oForm = $this->formNota(NULL, $oContribuinte);
         // Verifica se o contribuinte tem permissão para emitir nfse/rps
         if ($oContribuinte->getTipoEmissao() != Contribuinte_Model_ContribuinteAbstract::TIPO_EMISSAO_NOTA) {
             $this->view->empresa_nao_emissora_nfse = TRUE;
             return;
         }
         // Verifica se a empresa é prestadora de serviços
         $aServicos = Contribuinte_Model_Servico::getByIm($oContribuinte->getInscricaoMunicipal());
         if ($aServicos == NULL || empty($aServicos)) {
             $this->view->empresa_nao_prestadora = TRUE;
             return;
         }
         // Verifica o prazo de emissão de documentos e retorna as mensagens de erro
         self::mensagemPrazoEmissao();
         // Configura o formulário
         $oForm->preenche($aDados);
         $oForm->setListaServicos($aServicos);
         $this->view->form = $oForm;
         // Validadores
         $oValidaData = new Zend_Validate_Date(array('format' => 'yyyy-MM-dd'));
         // Bloqueia a emissão se possuir declarações sem movimento
         if (isset($aDados['dt_nota']) && $oValidaData->isValid($aDados['dt_nota'])) {
             $oDataSimples = new DateTime($aDados['dt_nota']);
             $aDeclaracaoSemMovimento = Contribuinte_Model_Competencia::getDeclaracaoSemMovimentoPorContribuintes($oContribuinte->getInscricaoMunicipal(), $oDataSimples->format('Y'), $oDataSimples->format('m'));
             if (count($aDeclaracaoSemMovimento) > 0) {
                 $sMensagemErro = 'Não é possível emitir um documento nesta data, pois a competência foi declarada como ';
                 $sMensagemErro .= 'sem movimento.<br>Entre em contato com o setor de arrecadação da prefeitura.';
                 $this->view->messages[] = array('error' => $sMensagemErro);
                 return;
             }
         }
         // Trata o post do formulário
         if ($this->getRequest()->isPost()) {
             $oNota = new Contribuinte_Model_Nota();
             // Valida os dados informados no formulário
             if (!$oForm->isValid($aDados)) {
                 $this->view->form = $oForm;
                 $this->view->messages[] = array('error' => $this->translate->_('Preencha os dados corretamente.'));
             } else {
                 if ($oNota::existeRps($oContribuinte, $aDados['n_rps'], $aDados['tipo_nota'])) {
                     $this->view->form = $oForm;
                     $this->view->messages[] = array('error' => $this->translate->_('Já existe um RPS com esta numeração.'));
                 } else {
                     $oAidof = new Administrativo_Model_Aidof();
                     $iInscricaoMunicipal = $oContribuinte->getInscricaoMunicipal();
                     /*
                      * Verifica se a numeração do AIDOF é válida
                      */
                     $lVerificaNumeracao = $oAidof->verificarNumeracaoValidaParaEmissaoDocumento($iInscricaoMunicipal, $aDados['n_rps'], $aDados['tipo_nota']);
                     if (!$lVerificaNumeracao) {
                         $sMensagem = 'A numeração do RPS não confere com os AIDOFs liberados.';
                         $this->view->messages[] = array('error' => $this->translate->_($sMensagem));
                         return;
                     }
                     // Remove chaves inválidas
                     unset($aDados['enviar'], $aDados['action'], $aDados['controller'], $aDados['module'], $aDados['estado']);
                     // Filtro para retornar somente numeros
                     $aFilterDigits = new Zend_Filter_Digits();
                     $aDados['p_im'] = $oContribuinte->getInscricaoMunicipal();
                     $aDados['grupo_nota'] = Contribuinte_Model_Nota::GRUPO_NOTA_RPS;
                     $aDados['t_cnpjcpf'] = $aFilterDigits->filter($aDados['t_cnpjcpf']);
                     $aDados['t_cep'] = $aFilterDigits->filter($aDados['t_cep']);
                     $aDados['t_telefone'] = $aFilterDigits->filter($aDados['t_telefone']);
                     $aDados['id_contribuinte'] = $oContribuinte->getIdUsuarioContribuinte();
                     $aDados['id_usuario'] = $this->usuarioLogado->getId();
                     if (!$oNota->persist($aDados)) {
                         $this->view->form = $oForm;
                         $this->view->messages[] = array('error' => $this->translate->_('Houver um erro ao tentar emitir a nota.'));
                         return NULL;
                     }
                     $this->view->messages[] = array('success' => $this->translate->_('Nota emitida com sucesso.'));
                     $this->_redirector->gotoSimple('dadosnota', 'nota', NULL, array('id' => $oNota->getId(), 'tipo_nota' => 'rps'));
                 }
             }
         }
     } catch (Exception $oError) {
         $this->view->messages[] = array('error' => $oError->getMessage());
         return;
     }
 }
예제 #3
0
 /**
  * Competencia referente a esta guia
  *
  * @return \Contribuinte_Model_Competencia
  */
 private function getCompetencia()
 {
     if ($this->competencia === NULL) {
         $this->competencia = Contribuinte_Model_Competencia::getByImCompetencia($this->getAnoComp(), $this->getMesComp(), $this->getIm());
     }
     return $this->competencia;
 }
예제 #4
0
 /**
  * Método para ver se a nota pode ser cancelada ou não
  * @param object $oContribuinte Model do contribuinte
  * @return boolean
  */
 public function podeCancelar($oContribuinte)
 {
     $oNota = $this->getEntity();
     $lExisteGuia = Contribuinte_Model_Guia::existeGuia($oContribuinte, $oNota->getMes_comp(), $oNota->getAno_comp(), Contribuinte_Model_Guia::$DOCUMENTO_ORIGEM_NFSE);
     $oSolicitacaoCancelamento = Contribuinte_Model_SolicitacaoCancelamento::getByAttribute('nota', $oNota);
     $uDataUltimaNota = Contribuinte_Model_Nota::getUltimaNotaEmitidaByContribuinte($oContribuinte->getContribuintes());
     $oDataUltimaNota = new DateTime($uDataUltimaNota);
     $oCompetencia = new Contribuinte_Model_Competencia($oNota->getAno_comp(), $oNota->getMes_comp(), $oContribuinte);
     $aCompetenciaSemMovimento = $oCompetencia->getDeclaracaoSemMovimento();
     if ($oNota->getAno_comp() < $oDataUltimaNota->format('Y')) {
         return FALSE;
     } else {
         if ($oNota->getAno_comp() == $oDataUltimaNota->format('Y') && $oNota->getMes_comp() < $oDataUltimaNota->format('m')) {
             return FALSE;
         } else {
             if ($oNota->getCancelada() || $lExisteGuia || $oNota->getImportada() || !empty($oSolicitacaoCancelamento)) {
                 return FALSE;
             } else {
                 if (isset($aCompetenciaSemMovimento[0]) && $oNota->getAno_comp() < $aCompetenciaSemMovimento[0]->ano) {
                     return FALSE;
                 } else {
                     if (isset($aCompetenciaSemMovimento[0]) && $oNota->getAno_comp() == $aCompetenciaSemMovimento[0]->ano && $oNota->getMes_comp() <= $aCompetenciaSemMovimento[0]->mes) {
                         return FALSE;
                     }
                 }
             }
         }
     }
     return TRUE;
 }
 /**
  * Geração do relatório de empresas omissas
  */
 public function empresasOmissasGerarAction()
 {
     parent::noLayout();
     $aValidacaoFormulario = self::validarFormulario(Fiscal_Form_Relatorio2::TIPO6);
     if (is_array($aValidacaoFormulario)) {
         exit($this->getHelper('json')->sendJson($aValidacaoFormulario));
     }
     try {
         // Parâmetros do formulário
         $sOrdenacaoCampo = $this->getRequest()->getParam('ordenacao');
         $sOrdenacaoDirecao = $this->getRequest()->getParam('ordem');
         $sCompetenciaInicial = $this->getRequest()->getParam('data_competencia_inicial');
         $sCompetenciaFinal = $this->getRequest()->getParam('data_competencia_final');
         // Separa os meses e anos
         $iCompetenciaInicialMes = intval(substr($sCompetenciaInicial, 0, 2));
         $iCompetenciaFinalMes = intval(substr($sCompetenciaFinal, 0, 2));
         $iCompetenciaInicialAno = intval(substr($sCompetenciaInicial, -4));
         $iCompetenciaFinalAno = intval(substr($sCompetenciaFinal, -4));
         $sNomeArquivo = 'relatorio_empresas_omissas_' . date('YmdHis') . '.pdf';
         $aDescricaoFiltros = array('inscricao_municipal' => 'Inscrição Municipal', 'nome' => 'Nome', 'asc' => 'Crescente', 'desc' => 'Decrescente');
         $oPdf = new Fiscal_Model_Relatoriopdfmodelo1('L');
         $oPdf->Open(APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}");
         $oPdf->setLinhaFiltro('Relatório de Empresas Omissas');
         $oPdf->setLinhaFiltro('');
         $oPdf->setLinhaFiltro("FILTRO: Competência de {$sCompetenciaInicial} até {$sCompetenciaFinal}");
         $oPdf->setLinhaFiltro("ORDEM: {$aDescricaoFiltros[$sOrdenacaoCampo]} ({$aDescricaoFiltros[$sOrdenacaoDirecao]})");
         $oPdf->carregaDados();
         $aUsuarioContribuintes = Administrativo_Model_UsuarioContribuinte::getPrestadores();
         $aInscricoesMunicipaisContribuintes = array();
         // Verifica se existem usuários contribuinte cadastrados
         if (count($aUsuarioContribuintes) == 0) {
             throw new Exception($this->translate->_('Não existem contribuintes cadastrados no sistema.'));
         }
         $aDeclaracaoIsentoValidos = array();
         for ($iAno = 0; $iAno <= $iCompetenciaFinalAno - $iCompetenciaInicialAno; $iAno++) {
             $iAnoLoop = intval($iCompetenciaInicialAno) + $iAno;
             // Varre os meses
             for ($iMesLoop = 1; $iMesLoop <= 12; $iMesLoop++) {
                 // Ignora os meses anteriores e seguintes aos meses inicial e final
                 if ($iAnoLoop == $iCompetenciaInicialAno && $iMesLoop < $iCompetenciaInicialMes || $iAnoLoop == $iCompetenciaFinalAno && $iMesLoop > $iCompetenciaFinalMes) {
                     continue;
                 }
                 // Varre a lista de usuários contribuintes, verificando quem tem movimentações
                 foreach ($aUsuarioContribuintes as $oContribuinte) {
                     // Verifica se tem movimentação
                     $sSql = "SELECT 1 AS existe_movimento\n                     FROM   view_nota_mais_dms\n                      WHERE (dms_operacao     = 's' OR dms_operacao IS NULL)   AND\n                            prestador_cnpjcpf = '{$oContribuinte->getCnpjCpf()}' AND\n                            documento_competencia_ano = {$iAnoLoop} AND\n                            documento_competencia_mes = {$iMesLoop}";
                     $oStatement = $this->oConexao->prepare($sSql);
                     $oStatement->execute();
                     // Adiciona na lista somente os contribuinte sem movimentação no sistema
                     if ($oStatement->rowCount() == 0) {
                         // Informações complementares do contribuinte
                         $oDadosContribuinteComplemento = Administrativo_Model_UsuarioContribuinteComplemento::getById($oContribuinte->getCnpjCpf());
                         // Variaveis do contribuinte
                         $iInscricaoMunicipal = $oContribuinte->getIm();
                         $sRazaoSocial = $oDadosContribuinteComplemento->getRazaoSocial();
                         $sEndereco = $oDadosContribuinteComplemento->getEnderecoDescricao();
                         if (strlen(trim($iInscricaoMunicipal)) > 0) {
                             // Dados dos contribuintes
                             $aDeclaracaoIsentoValidos[$iAnoLoop][$iMesLoop][$iInscricaoMunicipal] = array('inscricao_municipal' => $iInscricaoMunicipal, 'nome' => DBSeller_Helper_String_Format::wordsCap($sRazaoSocial), 'endereco' => DBSeller_Helper_String_Format::wordsCap($sEndereco), 'telefone' => $oDadosContribuinteComplemento->getContatoTelefone(), 'competencia_ano' => $iAnoLoop, 'competencia_mes' => $iMesLoop);
                         }
                         // Lista para consulta no webservice
                         $aInscricoesMunicipaisContribuintes[$iInscricaoMunicipal] = $iInscricaoMunicipal;
                     }
                 }
             }
         }
         // Mosta a lista de inscrições do contribuintes para verificação no webservice (separados por vírgula)
         $sInscricoesMunicipaisContribuintes = implode("','", $aInscricoesMunicipaisContribuintes);
         // Retorna apenas os contribuintes com declaração de insento
         $aDeclaracaoIsento = Contribuinte_Model_Competencia::getDeclaracaoSemMovimentoPorContribuintes($sInscricoesMunicipaisContribuintes);
         // Limpa as inscricoes com declaração de isenção
         foreach ($aDeclaracaoIsento as $oDeclaracaoIsento) {
             unset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes][$oDeclaracaoIsento->inscricao_municipal]);
             // Limpa dados do mes, caso não possua registros
             if (isset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes]) && count($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes]) == 0) {
                 unset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes]);
             }
             // Limpa dados do ano, caso não possua registros
             if (isset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano]) && count($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano]) == 0) {
                 unset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano]);
             }
         }
         if (count($aDeclaracaoIsentoValidos) == 0) {
             $sMensagemErro = 'Nenhuma informação foi encontrada neste período para geração do relatório.';
             throw new Exception($this->translate->_($sMensagemErro));
         }
         // Varre os anos
         for ($iAno = 0; $iAno <= $iCompetenciaFinalAno - $iCompetenciaInicialAno; $iAno++) {
             $iAnoLoop = intval($iCompetenciaInicialAno) + $iAno;
             // Varre os meses
             for ($iMesLoop = 1; $iMesLoop <= 12; $iMesLoop++) {
                 // Ignora os meses anteriores e seguintes aos meses inicial e final
                 if ($iAnoLoop == $iCompetenciaInicialAno && $iMesLoop < $iCompetenciaInicialMes || $iAnoLoop == $iCompetenciaFinalAno && $iMesLoop > $iCompetenciaFinalMes) {
                     continue;
                 }
                 // Ordena o array pelo índice informado
                 if (isset($aDeclaracaoIsentoValidos[$iAnoLoop][$iMesLoop])) {
                     // Formata para mês por extenso
                     $sMesExtenso = DBSeller_Helper_Date_Date::mesExtenso($iMesLoop);
                     $oPdf->SetFont('Arial', 'B', 8);
                     $oPdf->Cell(20, 5, utf8_decode('Competência:'));
                     $oPdf->SetFont('Arial', NULL, 8);
                     $oPdf->Cell(0, 5, utf8_decode("{$sMesExtenso}/{$iAnoLoop}"));
                     $oPdf->Ln(5);
                     $oPdf->SetFont('Arial', 'B', 8);
                     $oPdf->Cell(28, 5, utf8_decode('Inscrição Municipal'), 1);
                     $oPdf->Cell(100, 5, utf8_decode('Nome'), 1);
                     $oPdf->Cell(117, 5, utf8_decode('Endereço'), 1);
                     $oPdf->Cell(32, 5, utf8_decode('Telefone'), 1);
                     $oPdf->Ln(5);
                     $aDeclaracaoIsentoOrdenado = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDeclaracaoIsentoValidos[$iAnoLoop][$iMesLoop], $sOrdenacaoCampo, $sOrdenacaoDirecao, TRUE);
                     $oPdf->SetFont('Arial', NULL, 8);
                     foreach ($aDeclaracaoIsentoOrdenado as $oDeclaracaoIsentoOrdenado) {
                         $oPdf->Cell(28, 5, utf8_decode($oDeclaracaoIsentoOrdenado['inscricao_municipal']), 1);
                         $oPdf->Cell(100, 5, utf8_decode($oDeclaracaoIsentoOrdenado['nome']), 1);
                         $oPdf->Cell(117, 5, utf8_decode($oDeclaracaoIsentoOrdenado['endereco']), 1);
                         $oPdf->Cell(32, 5, utf8_decode($oDeclaracaoIsentoOrdenado['telefone']), 1);
                         $oPdf->Ln(5);
                     }
                     $oPdf->Ln(5);
                     $oPdf->proximaPagina(10);
                 }
             }
         }
         $oPdf->Output();
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['url'] = $this->view->baseUrl("tmp/{$sNomeArquivo}");
         $aRetornoJson['success'] = $this->translate->_('Arquivo importado com sucesso.');
     } catch (Exception $oErro) {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['error'][] = $oErro->getMessage();
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Formulário de impressão automatica das guias
  */
 public function impressaoGeracaoAutomaticaAction()
 {
     $oForm = new Fiscal_Form_Guias();
     $oForm->getElement('btn_gerar')->setAttrib('style', 'display:none;');
     $oForm->getElement('btn_consultar')->setLabel('Imprimir');
     $oForm->getElement('btn_consultar')->setAttrib('type', 'submit');
     $oForm->setAction($this->action);
     $this->view->oForm = $oForm;
     if ($this->getRequest()->isPost()) {
         $aParametros = $this->getRequest()->getParams();
         parent::noTemplate();
         $iMesCompetencia = str_pad($aParametros['mes_competencia'], 2, '0', STR_PAD_LEFT);
         $iAnoCompetencia = $aParametros['ano_competencia'];
         $aGuiasCompetencia = Contribuinte_Model_Competencia::getByGuiasContribuinteAndCompetencia($iMesCompetencia, $iAnoCompetencia);
         $oPrefeitura = Administrativo_Model_Prefeitura::getDadosPrefeituraBase();
         $aDadosRelatorio = array();
         foreach ($aGuiasCompetencia as $oGuia) {
             $oDados = new stdClass();
             $oDados->competencia = $oGuia->getCompetencia();
             $oDados->valorTotal = $oGuia->getFormatedTotalServico();
             $oDados->valorIss = $oGuia->getFormatedTotalIss();
             $oDados->razaoSocial = $oGuia->getContribuinte()->getNome();
             $oDados->im = $oGuia->getContribuinte()->getInscricaoMunicipal();
             $oDados->cnpj = $oGuia->getContribuinte()->getCgcCpf();
             $aDadosRelatorio[] = $oDados;
         }
         $oImpressaoRelatorio = new Fiscal_Model_ImpressaoRelatorioDeGuias();
         $oImpressaoRelatorio->setAmbiente(getenv("APPLICATION_ENV"));
         $oImpressaoRelatorio->setPrefeitura($oPrefeitura->getNome());
         $oImpressaoRelatorio->setDados($aDadosRelatorio);
         $aArquivo = $oImpressaoRelatorio->montaRelatorio();
         parent::download($aArquivo['filename']);
     }
 }
 /**
  * Valida a importação de arquivo do tipo RPS modelo 1 (ABRASF 1.0)
  */
 public function validaArquivoCarregado()
 {
     $oSessao = new Zend_Session_Namespace('nfse');
     if (empty($this->oDadosPrefeitura)) {
         $aParametrosPrefeitura = Administrativo_Model_ParametroPrefeitura::getAll(0, 1);
         if (count($aParametrosPrefeitura) == 0) {
             throw new Exception('Parâmetros da prefeitura não configurados. Processamento Abortado');
         }
         $this->oDadosPrefeitura = $aParametrosPrefeitura[0];
     }
     if (empty($this->oArquivoXmlRetorno->lote->numero)) {
         $this->setMensagemErro('E88');
     }
     if (empty($this->oArquivoXmlRetorno->lote->cnpj)) {
         $this->setMensagemErro('E46');
     }
     $oContribuinte = Contribuinte_Model_Contribuinte::getByCpfCnpj($this->oArquivoXmlRetorno->lote->cnpj);
     if (empty($oContribuinte)) {
         $this->setMensagemErro('E45', 'Contribuinte: ' . $this->oArquivoXmlRetorno->lote->cnpj);
     } else {
         if ($oContribuinte->getCgcCpf() != $oSessao->contribuinte->getCgcCpf()) {
             $this->setMensagemErro('E156', '', true);
         }
     }
     if ($this->oArquivoXmlRetorno->lote->quantidade_rps != count($this->oArquivoXmlRetorno->rps)) {
         $this->setMensagemErro('E69');
     }
     if (strlen($this->oArquivoXmlRetorno->lote->quantidade_rps) > 4) {
         $this->setMensagemErro('E72');
     }
     $aNumeracaoRPS = array();
     foreach ($this->oArquivoXmlRetorno->rps as $oRps) {
         if ($this->oArquivoXmlRetorno->lote->inscricao_municipal != $oRps->prestador->inscricao_municipal) {
             $this->setMensagemErro('E70', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->numero)) {
             $this->setMensagemErro('E11');
         } else {
             if (is_int($oRps->numero) && strlen($oRps->numero) > 15) {
                 $this->setMensagemErro('E96', 'RPS: ' . $oRps->numero);
             }
             if (in_array($oRps->numero, $aNumeracaoRPS)) {
                 $this->setMensagemErro('E71', 'RPS: ' . $oRps->numero);
             }
             $aNumeracaoRPS[$oRps->numero] = NULL;
         }
         if (strlen($oRps->serie) > 5) {
             $this->setMensagemErro('E97', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->tipo)) {
             $this->setMensagemErro('E12', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->natureza_operacao)) {
             $this->setMensagemErro('E3', 'RPS: ' . $oRps->numero);
         } else {
             if (!in_array($oRps->natureza_operacao, array(1, 2, 3, 4, 5, 6))) {
                 $this->setMensagemErro('E144', 'RPS: ' . $oRps->numero);
             }
         }
         if (empty($oRps->optante_simples_nacional)) {
             $this->setMensagemErro('E8', 'RPS: ' . $oRps->numero);
         } else {
             if (!in_array($oRps->optante_simples_nacional, array(1, 2))) {
                 $this->setMensagemErro('E146', 'RPS: ' . $oRps->numero);
             }
         }
         if (empty($oRps->incentivador_cultural)) {
             $this->setMensagemErro('E9', 'RPS: ' . $oRps->numero);
         } else {
             if (!in_array($oRps->incentivador_cultural, array(1, 2))) {
                 $this->setMensagemErro('E147', 'RPS: ' . $oRps->numero);
             }
         }
         if (empty($oRps->data_emissao)) {
             $this->setMensagemErro('E14', 'RPS: ' . $oRps->numero);
         }
         if (!in_array($oRps->status, array(1, 2))) {
             $this->setMensagemErro('E68', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->data_emissao->format('Ymd') > date('Ymd')) {
             $this->setMensagemErro('E16', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->prestador->cnpj == $oRps->tomador->cpf_cnpj) {
             $this->setMensagemErro('E52', 'RPS: ' . $oRps->numero);
         }
         // validação dos valores se float
         $oNumeroFloat = new Zend_Validate_Float();
         if ($oRps->servico->valores->valor_servicos <= 0) {
             $this->setMensagemErro('E18', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_servicos)) {
             $this->setMensagemErro('E100', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_servicos <= 0) {
             $this->setMensagemErro('E18', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_deducoes > $oRps->servico->valores->valor_servicos) {
             $this->setMensagemErro('E19', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_deducoes < 0) {
             $this->setMensagemErro('E20', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_deducoes)) {
             $this->setMensagemErro('E101', 'RPS: ' . $oRps->numero);
         }
         $fTotalDesconto = $oRps->servico->valores->desconto_incondicionado + $oRps->servico->valores->desconto_condicionado;
         if ($fTotalDesconto > $oRps->servico->valores->valor_servicos) {
             $this->setMensagemErro('E21', 'RPS: ' . $oRps->numero);
         }
         if ($fTotalDesconto < 0) {
             $this->setMensagemErro('E22', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($fTotalDesconto)) {
             $this->setMensagemErro('E102', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_pis < 0) {
             $this->setMensagemErro('E23', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_pis)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_cofins < 0) {
             $this->setMensagemErro('E24', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_cofins)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_inss < 0) {
             $this->setMensagemErro('E25', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_inss)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_ir < 0) {
             $this->setMensagemErro('E26', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_ir)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_csll < 0) {
             $this->setMensagemErro('E27', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_csll)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if (!in_array($oRps->servico->valores->iss_retido, array(1, 2))) {
             $this->setMensagemErro('E36', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->iss_retido == 1) {
             if ($oRps->servico->valores->valor_iss_retido <= 0) {
                 $this->setMensagemErro('E40', 'RPS: ' . $oRps->numero);
             }
             if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_iss_retido)) {
                 $this->setMensagemErro('E153', 'RPS: ' . $oRps->numero);
             }
             if (strlen(DBSeller_Helper_Number_Format::unmaskCPF_CNPJ($oRps->tomador->cpf_cnpj)) != 14) {
                 $this->setMensagemErro('E39', 'RPS: ' . $oRps->numero . ". Serviços tomados por pessoa Física não pode reter iss");
             }
         }
         if ($oRps->servico->valores->iss_retido == 1 && $oRps->servico->valores->valor_iss_retido > $oRps->servico->valores->valor_servicos) {
             $this->setMensagemErro('E99', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->servico->discriminacao)) {
             $this->setMensagemErro('E41', 'RPS: ' . $oRps->numero);
         }
         if (!empty($oContribuinte)) {
             $iInscricaoMunicipal = $oContribuinte->getInscricaoMunicipal();
             $aServicos = Contribuinte_Model_Servico::getByIm($iInscricaoMunicipal);
             // Valida se o prestador de serviço pode atuar no município
             if (empty($aServicos)) {
                 $this->setMensagemErro('E17', 'RPS: ' . $oRps->numero);
             }
             // Valida se o prestador do serviço é emissor de NFSE
             $iTipoEmissaoNfse = Contribuinte_Model_ContribuinteAbstract::TIPO_EMISSAO_NOTA;
             if ($oContribuinte->getTipoEmissao($iInscricaoMunicipal) != $iTipoEmissaoNfse) {
                 $this->setMensagemErro('E138', 'RPS: ' . $oRps->numero);
             }
             // Valida a competência
             $oCompetencia = new Contribuinte_Model_Competencia($oRps->data_emissao->format('Y'), $oRps->data_emissao->format('m'), $oContribuinte);
             if (empty($oCompetencia) || $oCompetencia->existeGuiaEmitida()) {
                 $this->setMensagemErro(null, "A competência da RPS \"{$oRps->numero}\" é inválida, já existe Guia Emitida.");
             }
         }
         // Valida se a data é maior que a atual
         if ($oRps->data_emissao->format('Y-m') > date('Y-m')) {
             $this->setMensagemErro('E2', 'RPS: ' . $oRps->numero);
         }
         // Valida se já existe na base de dados
         $oTipoRps = Administrativo_Model_ParametroPrefeituraRps::getByTipoNfse($oRps->tipo);
         $iTipoRps = 0;
         // Valida o tipo de RPS
         if (is_object($oTipoRps)) {
             $iTipoRps = $oTipoRps->getEntity()->getTipoEcidade($oRps->tipo);
         }
         if ($iTipoRps == 0) {
             $this->setMensagemErro('E13', 'RPS: ' . $oRps->numero);
         }
         // Verifica se a numeração do AIDOF é válida
         $oAidof = new Administrativo_Model_Aidof();
         $lVerificaNumeracaoRps = $oAidof->verificarNumeracaoValidaParaEmissaoDocumento($oSessao->contribuinte->getInscricaoMunicipal(), $oRps->numero, $iTipoRps);
         if ($lVerificaNumeracaoRps === FALSE) {
             $this->setMensagemErro('E90', 'RPS: ' . $oRps->numero);
         }
         $lExisteRps = Contribuinte_Model_Nota::existeRps($oSessao->contribuinte, $oRps->numero, $oRps->tipo);
         if ($lExisteRps) {
             $this->setMensagemErro('E10', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->servico->atividade)) {
             $this->setMensagemErro('E31', 'RPS: ' . $oRps->numero);
         } else {
             if (strlen($oRps->servico->atividade) > 5) {
                 $this->setMensagemErro('E104', 'RPS: ' . $oRps->numero);
             }
             // Valida Grupo de Serviço/Atividade
             if (!empty($iInscricaoMunicipal)) {
                 $oServico = Contribuinte_Model_Servico::getServicoPorAtividade($iInscricaoMunicipal, $oRps->servico->atividade);
                 if (!$oServico) {
                     $this->setMensagemErro('E30', 'RPS: ' . $oRps->numero);
                 }
             }
         }
         if (empty($oRps->servico->codigo_cnae)) {
             $this->setMensagemErro('E33', 'RPS: ' . $oRps->numero);
         } else {
             if (strlen($oRps->servico->codigo_cnae) > 7) {
                 $this->setMensagemErro('E105', 'RPS: ' . $oRps->numero);
             }
         }
         if (!empty($oRps->servico->ibge_municipio)) {
             if (strlen($oRps->servico->ibge_municipio) > 7) {
                 $this->setMensagemErro('E108', 'RPS: ' . $oRps->numero);
             }
             // 2 = fora do municipio
             if ($oRps->natureza_operacao == 2 && $oRps->servico->ibge_municipio == $this->oDadosPrefeitura->getIbge()) {
                 $this->setMensagemErro('E110', 'RPS: ' . $oRps->numero);
             }
         }
         // Validar IBGE Prefeitura
         if ($oRps->natureza_operacao == 1 && $this->oDadosPrefeitura->getIbge() !== $oRps->servico->ibge_municipio) {
             $this->setMensagemErro('E42', 'RPS: ' . $oRps->numero);
         }
         if (strlen($oRps->construcao_civil->art) > 15) {
             $this->setMensagemErro('E130', 'RPS: ' . $oRps->numero);
         }
         if (strlen($oRps->construcao_civil->codigo_obra) > 15) {
             $this->setMensagemErro('E129', 'Rps: ' . $oRps->numero);
         }
         if (count($this->aMensagensErroValidacao) >= 50) {
             $this->setMensagemErro('E49', '', TRUE);
         }
     }
     // Se existirem erros executa uma exceção com a lista de erros
     if (count($this->aMensagensErroValidacao) > 0) {
         return FALSE;
     }
     return TRUE;
 }
 /**
  * Gera a declaracao mensal Sem Movimento para o e-cidade
  */
 public function declaracaoSemMovimentoGerarAction()
 {
     try {
         $iMes = intval($this->_getParam('mes_competencia'));
         $iAno = (int) ((int) date('m') == 1 ? date('Y') - 1 : date('Y'));
         $oContribuinte = $this->_session->contribuinte;
         $oCompetencia = new Contribuinte_Model_Competencia($iAno, $iMes, $oContribuinte);
         $lGerarComptencia = $oCompetencia->gerarDeclaracaoSemMovimento();
         if (!$lGerarComptencia) {
             throw new Exception($this->translate->_('Erro ao gerar declaração'));
         }
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['reload'] = TRUE;
         $aRetornoJson['success'] = $this->translate->_('Operação efetuada com sucesso');
         echo $this->getHelper('json')->sendJson($aRetornoJson);
     } catch (Exception $oErro) {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['error'][] = sprintf($this->translate->_('Erro: %s'), $oErro->getMessage());
         echo $this->getHelper('json')->sendJson($aRetornoJson);
     }
 }
 /**
  * Lista de DMS emitidos manualmente
  */
 public function emissaoManualSaidaListaDmsAction()
 {
     try {
         // Parametros request
         $iMes = $this->getRequest()->getParam('mes');
         $iAno = $this->getRequest()->getParam('ano');
         // Perfil do usuario logado
         $iIdPerfil = $this->oUsuario->getPerfil()->getId();
         // Dados do DMS
         $oDms = new Contribuinte_Model_Dms();
         $aDms = $oDms->getCompetenciaByCpfCnpj($this->oContribuinte->getCgcCpf(), $iMes, $iAno);
         $aResultado = array();
         if (count($aDms) > 0) {
             foreach ($aDms as $oDms) {
                 $fValorDms = 0;
                 if ($oDms->getStatus() == 'emitida') {
                     $iNumpre = Contribuinte_Model_DmsNota::getNumpreByIdDms($oDms->getId());
                     $sStatus = Contribuinte_Model_GuiaEcidade::atualizaSituacao($iNumpre, $iMes);
                     if ($sStatus == 'ABERTO') {
                         $sStatus = 'Emitida Guia';
                     }
                 } else {
                     $sStatus = $oDms->getStatus();
                 }
                 foreach ($oDms->getDmsNotas() as $oNota) {
                     $fValorDms += $oNota->getServicoValorImposto();
                 }
                 // Formata os dados
                 $sMesCompetencia = DBSeller_Helper_Date_Date::mesExtenso($oDms->getMesCompetencia());
                 // Dados do dms para a view
                 $oDmsView = new stdClass();
                 $oDmsView->id = $oDms->getId();
                 $oDmsView->data_operacao = $oDms->getDataOperacao()->format('d/m/Y');
                 $oDmsView->fechado = $oDms->getStatus() == 'fechado';
                 $oDmsView->competencia = "{$sMesCompetencia}/{$oDms->getAnoCompetencia()}";
                 $oDmsView->status_guia = ucfirst(strtolower($sStatus));
                 $oDmsView->valor_imposto = DBSeller_Helper_Number_Format::toMoney($fValorDms, 2, 'R$ ');
                 // Lista de DMS da view
                 $aResultado[] = $oDmsView;
             }
         }
         // Verifica se tem requisicoes liberadas (ignora para contribuinte eventual)
         if ($iIdPerfil != self::PERFIL_PRESTADOR_EVENTUAL) {
             // Verifica se tem requisicoes liberadas
             $iTiposLiberados = 0;
             $aTiposDocumentosLiberados = Administrativo_Model_RequisicaoAidof::getRequisicoesAidof($this->oContribuinte->getInscricaoMunicipal());
             if (count($aTiposDocumentosLiberados) > 0) {
                 foreach ($aTiposDocumentosLiberados as $oTiposDocumentos) {
                     if (in_array($oTiposDocumentos->status, array('', 'L'))) {
                         $iTiposLiberados++;
                     }
                 }
             }
             if (count($aTiposDocumentosLiberados) <= 0 || $iTiposLiberados == 0) {
                 $this->view->sem_requisicao = TRUE;
             }
         }
         // Verifica se o contribuinte declarou sem movimento
         $aDeclaracaoSemMovimento = Contribuinte_Model_Competencia::getDeclaracaoSemMovimentoPorContribuintes(array($this->oContribuinte->getInscricaoMunicipal()), $iAno, $iMes);
         if (count($aDeclaracaoSemMovimento) > 0) {
             $this->view->declarado_sem_movimento = TRUE;
         }
         // Dados da competência
         $oCompetencia = new stdClass();
         $oCompetencia->mes = $iMes;
         $oCompetencia->ano = $iAno;
         // Dados da view
         $this->view->aDms = $aResultado;
         $this->view->competencia = $oCompetencia;
     } catch (Exception $oError) {
         $this->view->messages[] = array('error' => $this->translate->_($oError->getMessage()));
     }
 }
 /**
  * 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;
 }
 /**
  * Emissao de NFSE
  */
 public function indexAction()
 {
     $oContribuinte = $this->_session->contribuinte;
     $sCodigoVerificacao = NULL;
     $oForm = $this->formNota($sCodigoVerificacao, $oContribuinte);
     try {
         $this->view->bloqueado_msg = FALSE;
         $aServicos = Contribuinte_Model_Servico::getByIm($oContribuinte->getInscricaoMunicipal());
         $oForm->setListaServicos($aServicos);
         // Verifica se o contribuinte é prestador de serviços
         if ($aServicos == NULL || empty($aServicos)) {
             $this->view->bloqueado_msg = $this->translate->_('Empresa não prestadora de serviço.');
             return;
         }
         // Verifica se o contribuinte é emissor de NFSe
         if ($oContribuinte->getTipoEmissao() != Contribuinte_Model_ContribuinteAbstract::TIPO_EMISSAO_NOTA) {
             $this->view->bloqueado_msg = $this->translate->_('Empresa não emissora de NFS-E.');
             return;
         }
         // Dados do formulário
         $aDados = $this->getRequest()->getParams();
         // Preeenche da nota copiada
         if (isset($aDados['id_copia'])) {
             $iIdCopiaNota = $aDados['id_copia'];
             $aCopiaDadosNota = Contribuinte_Model_Nota::getByAttribute('id', $iIdCopiaNota, '=', Contribuinte_Model_Nota::TIPO_RETORNO_ARRAY);
             $aDados = $aCopiaDadosNota[0];
             $aDados['id_copia_nota'] = $iIdCopiaNota;
         }
         $oForm->preenche($aDados);
         $oForm->getElement('nota_substituida')->setRequired($oForm->getElement('nota_substituta')->isChecked());
         // Processa o formulário
         if ($this->getRequest()->isPost()) {
             // Verifica se é tomador é
             if (!$this->podeReterPessoaFisica($aDados)) {
                 $sMensagemErro = 'Permitido reter apenas para Pessoa Jurídica.';
                 $this->view->form = $oForm;
                 $this->view->messages[] = array('error' => $sMensagemErro);
                 return;
             }
             // Limpa espaços no email
             $aDados['t_email'] = trim($aDados['t_email']);
             // Validadores
             $oValidaData = new Zend_Validate_Date(array('format' => 'yyyy-MM-dd'));
             // Bloqueia a emissão se possuir declarações sem movimento
             if (isset($aDados['dt_nota']) && $oValidaData->isValid($aDados['dt_nota'])) {
                 $oDataSimples = new DateTime($aDados['dt_nota']);
                 $aDeclaracaoSemMovimento = Contribuinte_Model_Competencia::getDeclaracaoSemMovimentoPorContribuintes($oContribuinte->getInscricaoMunicipal(), $oDataSimples->format('Y'), $oDataSimples->format('m'));
                 if (count($aDeclaracaoSemMovimento) > 0 && $oContribuinte->getOptanteSimplesCategoria() != Contribuinte_Model_ContribuinteAbstract::OPTANTE_SIMPLES_TIPO_MEI) {
                     $sMensagemErro = 'Não é possível emitir um documento nesta data, pois a competência foi declarada como ';
                     $sMensagemErro .= 'sem movimento.<br>Entre em contato com o setor de arrecadação da prefeitura.';
                     $this->view->form = $oForm;
                     $this->view->messages[] = array('error' => $sMensagemErro);
                     return;
                 }
             }
             // Valida os dados do formulário
             if (!$oForm->isValid($aDados)) {
                 $this->view->form = $oForm;
                 $this->view->messages[] = array('error' => $this->translate->_('Preencha os dados corretamente.'));
             } else {
                 // Remova chaves inválidas
                 unset($aDados['enviar'], $aDados['action'], $aDados['controller'], $aDados['module'], $aDados['estado']);
                 // filtro para retornar somente numeros
                 $aFilterDigits = new Zend_Filter_Digits();
                 $aDados['p_im'] = $oContribuinte->getInscricaoMunicipal();
                 $aDados['t_cnpjcpf'] = $aFilterDigits->filter($aDados['t_cnpjcpf']);
                 $aDados['t_cep'] = $aFilterDigits->filter($aDados['t_cep']);
                 $aDados['t_telefone'] = $aFilterDigits->filter($aDados['t_telefone']);
                 $aDados['tipo_nota'] = self::TIPO_NOTA;
                 // Recalcula valores para garantir a integridade dos cálculos
                 $aServico = Contribuinte_Model_Servico::getByCodServico($aDados['s_dados_cod_tributacao']);
                 $oServico = reset($aServico);
                 /* caso a atividade sejá retida no municipio de acordo com a legislação
                  * envia para o teste de guia um parametro = true
                  */
                 $aDados['s_tributacao_municipio'] = $oServico->attr('tributacao_municipio');
                 $oParametros = new stdClass();
                 $oParametros->vlr_servico = $oForm->getElement('s_vl_servicos')->getValue();
                 $oParametros->s_vl_deducoes = $oForm->getElement('s_vl_deducoes')->getValue();
                 $oParametros->perc_aliquota = $oForm->getElement('s_vl_aliquota')->getValue();
                 $oParametros->vlr_pis = $oForm->getElement('s_vl_pis')->getValue();
                 $oParametros->vlr_cofins = $oForm->getElement('s_vl_cofins')->getValue();
                 $oParametros->vlr_inss = $oForm->getElement('s_vl_inss')->getValue();
                 $oParametros->vlr_ir = $oForm->getElement('s_vl_ir')->getValue();
                 $oParametros->vlr_csll = $oForm->getElement('s_vl_csll')->getValue();
                 $oParametros->vlr_outras_retencoes = $oForm->getElement('s_vl_outras_retencoes')->getValue();
                 $oParametros->vlr_desc_condicionado = $oForm->getElement('s_vl_condicionado')->getValue();
                 $oParametros->vlr_desc_incondicionado = $oForm->getElement('s_vl_desc_incondicionado')->getValue();
                 $oParametros->imposto_retido_tomador = $oForm->getElement('s_dados_iss_retido')->getValue() == 1;
                 $oParametros->deducao_editavel = $oServico->attr('deducao') == 't';
                 $oParametros->formatar_valores_ptbr = TRUE;
                 // Calcula os valores da nota
                 $oCalculoValores = Contribuinte_Model_Nota::calcularValores($oParametros);
                 // Valores calculados
                 $aDados['s_vl_deducoes'] = $oCalculoValores->s_vl_deducoes;
                 $aDados['s_vl_bc'] = $oCalculoValores->vlr_base;
                 $aDados['s_vl_iss'] = $oCalculoValores->vlr_iss;
                 $aDados['s_vl_pis'] = $oCalculoValores->vlr_pis;
                 $aDados['s_vl_cofins'] = $oCalculoValores->vlr_cofins;
                 $aDados['s_vl_inss'] = $oCalculoValores->vlr_inss;
                 $aDados['s_vl_ir'] = $oCalculoValores->vlr_ir;
                 $aDados['s_vl_csll'] = $oCalculoValores->vlr_csll;
                 $aDados['s_vl_outras_retencoes'] = $oCalculoValores->vlr_outras_retencoes;
                 $aDados['s_vl_condicionado'] = $oCalculoValores->vlr_desc_condicionado;
                 $aDados['s_vl_desc_incondicionado'] = $oCalculoValores->vlr_desc_incondicionado;
                 $aDados['s_vl_liquido'] = $oCalculoValores->vlr_liquido;
                 $aDados['dt_nota'] = Contribuinte_Model_Nota::getDateTime($aDados['dt_nota']);
                 $aDados['id_contribuinte'] = $oContribuinte->getIdUsuarioContribuinte();
                 $aDados['id_usuario'] = $this->usuarioLogado->getId();
                 if ($oForm->getElement('nota_substituta')->isChecked()) {
                     $aAtributosPesquisaNotaSubstituida = array('id_contribuinte' => $oContribuinte->getIdUsuarioContribuinte(), 'nota' => $aDados['nota_substituida'], 'cancelada' => FALSE);
                     $oNotaSubstituida = Contribuinte_Model_Nota::getByAttributes($aAtributosPesquisaNotaSubstituida);
                     $oNotaSubstituida = reset($oNotaSubstituida);
                     /*
                      * Caso exista a nota a ser substituida, verifica:
                      *  - Se já não possue nota substituta
                      *  - Se não possui guia emitida
                      */
                     if ($oNotaSubstituida instanceof Contribuinte_Model_Nota && !$oNotaSubstituida->getIdNotaSubstituta() && !Contribuinte_Model_Guia::existeGuia($oContribuinte, $oNotaSubstituida->getMes_comp(), $oNotaSubstituida->getAno_comp(), Contribuinte_Model_Guia::$DOCUMENTO_ORIGEM_NFSE)) {
                         // Seta os dados da nota
                         $aDados['idNotaSubstituida'] = $oNotaSubstituida->getId();
                     } else {
                         $sMensagemErro = '<b>Erro ao substituir a nota, verifique se:</b><br>';
                         $sMensagemErro .= '- A nota informada já foi emitida no sistema.<br>';
                         $sMensagemErro .= '- A nota informada não foi substituida.<br>';
                         $sMensagemErro .= '- A nota informada não possui guia emitida.';
                         $this->view->messages[] = array('error' => $this->translate->_($sMensagemErro));
                         $this->view->form = $oForm;
                         return NULL;
                     }
                     unset($aDados['nota_substituta'], $aDados['nota_substituida']);
                 }
                 // Verifica se a nota é substituta
                 // Persiste os dados na base de dados
                 $oNota = new Contribuinte_Model_Nota();
                 if ($oNota->persist($aDados)) {
                     // Se for nota substituta
                     if (isset($oNotaSubstituida) && $oNotaSubstituida instanceof Contribuinte_Model_Nota) {
                         $sMensagemCancelamento = "Substituida pela Nota nº {$oNota->getNota()}";
                         $oNotaSubstituida->setIdNotaSubstituta($oNota->getId());
                         $oNotaSubstituida->setCancelada(TRUE);
                         $oNotaSubstituida->setCancelamentoJustificativa($this->translate->_($sMensagemCancelamento));
                         $oNotaSubstituida->setEmite_guia(FALSE);
                         $oNotaSubstituida->persist($oNotaSubstituida->getEntity());
                     }
                 } else {
                     $this->view->form = $oForm;
                     $this->view->messages[] = array('error' => $this->translate->_('Ocorreu um erro emitir a nota.'));
                     return NULL;
                 }
                 // Envia email para o tomador
                 $oValidaEmail = new Zend_Validate_EmailAddress();
                 if ($oValidaEmail->isValid($aDados['t_email'])) {
                     $iInscricaoMunicipal = $aDados['p_im'];
                     $oContribuinte = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($iInscricaoMunicipal);
                     // Informações da view
                     $this->view->nota = $oNota;
                     $this->view->tomadorNome = $aDados['t_razao_social'];
                     $this->view->prestadorNome = $oContribuinte->getNome('nome');
                     $this->view->prestadorCnpj = DBSeller_Helper_Number_Format::maskCPF_CNPJ($oContribuinte->getCgcCpf());
                     $this->view->nfseNumero = $oNota->getNota();
                     $this->view->nfseUrl = $oNota->getUrlVerificacaoNota();
                     // Renderiza o email com o texto diferente para notas substitutas
                     if (isset($oNotaSubstituida) && $oNotaSubstituida instanceof Contribuinte_Model_Nota) {
                         // Informações da View
                         $this->view->sUrlNotaSubstituida = $oNotaSubstituida->getUrlVerificacaoNota();
                         $this->view->oNotaSubstituida = $oNotaSubstituida;
                         $sMensagemEmail = $this->view->render('nota/email-emissao-substituida.phtml');
                     } else {
                         $sMensagemEmail = $this->view->render('nota/email-emissao.phtml');
                     }
                     $sArquivoPdfNfse = $this->getNotaImpressao($oNota->getCod_verificacao(), TRUE, TRUE);
                     // Envia Email
                     DBSeller_Helper_Mail_Mail::sendAttachment($aDados['t_email'], "Nota Fiscal Eletrônica nº {$oNota->getNota()}", $sMensagemEmail, $sArquivoPdfNfse);
                 }
                 $this->view->messages[] = array('success' => $this->translate->_('Nota emitida com sucesso.'));
                 $this->_redirector->gotoSimple('dadosnota', NULL, NULL, array('id' => $oNota->getId()));
             }
         } else {
             $this->view->form = $oForm;
             $this->view->form->setListaServicos($aServicos);
         }
     } catch (Exception $oError) {
         $this->view->form = $oForm;
         $this->view->messages[] = array('error' => $this->translate->_($oError->getMessage()));
         return NULL;
     }
 }
 /**
  * Remove os Meses que existe movimentacao ou foi declarado sem movimento
  *
  * @return $this
  */
 public function removerMesesComMovimentacaoDeNotas()
 {
     $oSession = new Zend_Session_Namespace('nfse');
     $iMesCompetencia = (int) date('m') - 1;
     $iAnoCompetencia = (int) ((int) date('m') == 1 ? date('Y') - 1 : date('Y'));
     $oContribuinte = $oSession->contribuinte;
     $oCompetencia = new Contribuinte_Model_Competencia($iAnoCompetencia, $iMesCompetencia, $oContribuinte);
     $aMeses = DBSeller_Helper_Date_Date::getMesesAnterioresArray($iMesCompetencia);
     $aDeclaracaoSemMovimento = $oCompetencia->getDeclaracaoSemMovimento();
     // Remove os meses que já tem declaracao sem movimento
     if (count($aDeclaracaoSemMovimento) > 0) {
         foreach ($aDeclaracaoSemMovimento as $oDeclaracaoSemMovimento) {
             unset($aMeses[$oDeclaracaoSemMovimento->mes]);
         }
     }
     // Verifica se existem notas lancadas no NFSE
     if (count($aMeses) > 0) {
         foreach ($aMeses as $iMes => $sMes) {
             $aResultadoDms = Contribuinte_Model_Dms::getDadosPorCompetencia($oContribuinte->getContribuintes(), $iAnoCompetencia, $iMes, Contribuinte_Model_Dms::SAIDA);
             // Verifica se tem NFSe lancadas na competência
             $oParametros = new stdClass();
             $oParametros->iMes = $iMes;
             $oParametros->iAno = $iAnoCompetencia;
             $aResultadoNota = Contribuinte_Model_Nota::getByContribuinteAndCompetencia($oContribuinte->getContribuintes(), $oParametros);
             // Limpa os meses
             if (count($aResultadoDms) > 0 || count($aResultadoNota) > 0) {
                 unset($aMeses[$iMes]);
             }
         }
     }
     // Desabilita geração quando não possuir meses válidos
     if (count($aMeses) == 0) {
         $this->getElement('mes_competencia')->setAttrib('disabled', TRUE);
         $this->getElement('btn_competencia')->setAttrib('disabled', TRUE);
     }
     $this->getElement('mes_competencia')->setMultiOptions($aMeses);
     return $this;
 }