Exemplo n.º 1
0
 /**
  * Gera guia para substituto tributário
  *
  * @param $notas
  * @param $data
  * @return array
  */
 public function gerarGuiaTomador($notas, $data)
 {
     if ($data == '') {
         $data = new DateTime();
     } else {
         $data = parent::stringToDate($data);
     }
     $cpfcnpj = $notas[0]->getT_cnpjcpf();
     $inscricao = $notas[0]->getT_im();
     $ano_comp = $notas[0]->getAno_comp();
     $mes_comp = $notas[0]->getMes_comp();
     $planilha = Contribuinte_Model_GuiaEcidade::gerarPlanilhaRetencao($cpfcnpj, $inscricao, $ano_comp, $mes_comp);
     $array_servicos = array();
     // Vetor que faz cache das descricoes dos servicos
     foreach ($notas as $n) {
         $this->addNota($n->getEntity());
         $cod_serv = $n->getS_dados_cod_tributacao();
         if (!isset($array_servicos[$cod_serv])) {
             $serv = Contribuinte_Model_Servico::getByCodServico($cod_serv);
             $descr_serv = urlencode($serv[0]->attr('desc_item_servico'));
             $array_servicos[$cod_serv] = $descr_serv;
         }
         Contribuinte_Model_GuiaEcidade::lancarPlanilhaRetencao($planilha, $n, $data, $array_servicos[$cod_serv]);
     }
     $guiaWS = Contribuinte_Model_GuiaEcidade::gerarGuiaTomador($planilha);
     $this->setValorCorrigido($guiaWS->valor_corrigido);
     $this->setValorHistorico($guiaWS->valor_historico);
     $this->setCodigoBarras($guiaWS->codigo_barras);
     $this->setLinhaDigitavel($guiaWS->linha_digitavel);
     $this->setJurosMulta($guiaWS->juros_multa);
     $this->setCodigoGuia($guiaWS->codigo_guia);
     $numpre = each($guiaWS->debitos_guia);
     $this->setNumpre($numpre['value']->iNumpre);
     $this->setAnoComp($ano_comp);
     $this->setMesComp($mes_comp);
     $this->setTipo(self::$TOMADOR);
     $this->setSituacao(self::$ABERTA);
     $this->setTipoDocumentoOrigem(self::$DOCUMENTO_ORIGEM_DMS);
     $this->setIm($inscricao);
     $this->setVencimento($data);
     $this->persist();
     return array('objeto' => $this, 'arquivo' => $guiaWS->arquivo_guia);
 }
 /**
  * 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);
 }
Exemplo n.º 3
0
 /**
  * Retorna os dados do serviço
  */
 private function obtemDadosServico()
 {
     if ($this->entity->getS_dados_cod_tributacao()) {
         $servico = Contribuinte_Model_Servico::getByCodServico($this->entity->getS_dados_cod_tributacao());
         $this->descricao_lista_servico = $servico[0]->attr('desc_item_servico');
     } else {
         $this->descricao_lista_servico = 'Serviço/Atividade Não Informado';
     }
 }
 /**
  * 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;
     }
 }