/** * Consulta notas para exportar RPS */ public function rpsConsultarAction() { parent::noTemplate(); $aParametros = $this->getRequest()->getParams(); /** * Verifica se foi informado mês e ano da competência */ if (!empty($aParametros['mes_competencia']) && !empty($aParametros['ano_competencia'])) { $oContribuinte = $this->_session->contribuinte; $sCodigosContribuintes = implode(',', $oContribuinte->getContribuintes()); $oPaginatorAdapter = new DBSeller_Controller_Paginator(Contribuinte_Model_Nota::getQuery(), 'Contribuinte_Model_Nota', 'Contribuinte\\Nota'); /** * Monta a query de consulta */ $oPaginatorAdapter->where("e.id_contribuinte in ({$sCodigosContribuintes})"); $oPaginatorAdapter->andWhere("e.mes_comp = {$aParametros['mes_competencia']}"); $oPaginatorAdapter->andWhere("e.ano_comp = {$aParametros['ano_competencia']}"); if (!empty($aParametros['numero_rps'])) { $oPaginatorAdapter->andWhere("e.nota = {$aParametros['numero_rps']}"); } $oPaginatorAdapter->orderBy('e.nota', 'DESC'); /** * Monta a paginação do GridPanel */ $oResultado = new Zend_Paginator($oPaginatorAdapter); $oResultado->setItemCountPerPage(10); $oResultado->setCurrentPageNumber($this->_request->getParam('page')); foreach ($oResultado as $oNota) { $oNota->oContribuinte = $oContribuinte; $oNota->lNaoGeraGuia = !$oNota->getEmite_guia(); $oNota->lGuiaEmitida = Contribuinte_Model_Guia::existeGuia($oContribuinte, $oNota->getMes_comp(), $oNota->getAno_comp(), Contribuinte_Model_Guia::$DOCUMENTO_ORIGEM_NFSE); /** * Informações da nota substituta */ $oNota->oNotaSubstituida = NULL; if ($oNota->getIdNotaSubstituida()) { $oNota->oNotaSubstituida = Contribuinte_Model_Nota::getById($oNota->getIdNotaSubstituida()); } /** * Informações da nota substituta */ $oNota->oNotaSubstituta = NULL; if ($oNota->getIdNotaSubstituta()) { $oNota->oNotaSubstituta = Contribuinte_Model_Nota::getById($oNota->getIdNotaSubstituta()); } } /** * Valores da pesquisa para montar a paginação */ if (is_array($aParametros)) { foreach ($aParametros as $sParametro => $sParametroValor) { if ($sParametroValor) { $sParametroValor = str_replace('/', '-', $sParametroValor); $this->view->sBusca .= "{$sParametro}/{$sParametroValor}/"; } } } $this->view->oDadosNota = $oResultado; } }
/** * Fecha a competência para as Notas Fiscais (NFSE) */ public function fechaCompetenciaAction() { parent::noTemplate(); $iMes = $this->getRequest()->getParam('mes'); $iAno = $this->getRequest()->getParam('ano'); $oContribuinte = $this->_session->contribuinte; $oCompetencia = new Contribuinte_Model_Competencia($iAno, $iMes, $oContribuinte); $oCompetencia->getNotas(); $oCompetencia->setTotaisCompetencia(); $oFormCompetencia = new Contribuinte_Form_GuiaCompetencia(); $oFormCompetencia->setAction('/contribuinte/guia/fecha-competencia'); $oFormCompetencia->preenche($oCompetencia, NULL); $oFormCompetencia->getElement('data_guia')->setValue(date('d/m/Y')); $this->view->competencia = $oCompetencia; $this->view->form = $oFormCompetencia; if ($this->getRequest()->isPost()) { $this->view->arquivo = ''; $this->view->guia = ''; try { $lTemGuiaEmitida = Contribuinte_Model_Guia::existeGuia($oContribuinte, $oCompetencia->getMesComp(), $oCompetencia->getAnoComp(), Contribuinte_Model_Guia::$DOCUMENTO_ORIGEM_NFSE); if ($lTemGuiaEmitida) { throw new Exception('Guia já emitida.'); } $sDataInvertida = DBSeller_Helper_Date_Date::invertDate($this->getRequest()->getParam('data_guia')); $oDataPagamento = new DateTime($sDataInvertida); $oGuia = Contribuinte_Model_GuiaEcidade::gerarGuiaNFSE($oContribuinte, $oCompetencia, $oDataPagamento); // Verifica se retornou algum erro no processo de geração da guia if (is_string($oGuia)) { throw new Exception($oGuia); } // Verifica se foi gerado o arquivo de emissão da guia if (empty($oGuia->arquivo_guia)) { throw new Exception('Ocorreu algum problema na geração da guia de pagamento!'); } $this->view->arquivo = $oGuia->arquivo_guia; } catch (Exception $oErro) { $this->view->mensagem_erro = $oErro->getMessage(); } } }
/** * 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; }
/** * Verifica se existe guia emitida * * @return boolean */ public function existeGuiaEmitida() { return Contribuinte_Model_Guia::existeGuia($this->oContribuinte, $this->iMesCompetencia, $this->iAnoCompetencia, 10); }
/** * Gera a guia de DES-IF no eCidade * * @param Contribuinte_Model_Contribuinte $oContribuinte * @param $iAnoCompetencia * @param $iMesCompetencia * @param DateTime $oDataPagamento * @param $fAliquota * @param bool $lGerarPdf * @return bool * @throws Exception */ public static function gerarGuiaDesif(Contribuinte_Model_Contribuinte $oContribuinte, $iAnoCompetencia, $iMesCompetencia, DateTime $oDataPagamento, $fAliquota, $lGerarPdf = TRUE) { // Verifica se já possui uma guia emitida $lTemGuiaEmitida = Contribuinte_Model_Guia::existeGuia($oContribuinte, $iMesCompetencia, $iAnoCompetencia, Contribuinte_Model_Guia::$DOCUMENTO_ORIGEM_NFSE); if ($lTemGuiaEmitida) { throw new Exception('Guia já emitida.'); } $aReceitasDesif = Contribuinte_Model_ImportacaoDesif::getTotalReceitasCompetencia($oContribuinte, $iAnoCompetencia, $iMesCompetencia, $fAliquota); $sDataPagamento = $oDataPagamento->format('d/m/Y'); $oUsuarioContribuinte = Administrativo_Model_UsuarioContribuinte::getById($oContribuinte->getIdUsuarioContribuinte()); $oValidateDate = new Zend_Validate_Date(); $sData = DBSeller_Helper_Date_Date::invertDate($sDataPagamento); $sDataValidacao = DBSeller_Helper_Date_Date::invertDate($sDataPagamento, ''); if ($sDataValidacao < date('Ymd')) { throw new Exception('Informe uma data posterior a data atual!'); } if ($oValidateDate->isValid($sDataPagamento)) { $oData = new DateTime($sData); } else { throw new Exception('Informe uma data para pagamento válida!'); } /** * Alterado o parametro de envio do cpf_cnpj para o e-cidade pois não estava sendo passado corretamente. */ $iCpfCnpj = $oUsuarioContribuinte->getCnpjCpf(); $iCpf = strlen($iCpfCnpj) == 11 ? $iCpfCnpj : NULL; $iCnpj = strlen($iCpfCnpj) == 14 ? $iCpfCnpj : NULL; $oGuiaGerar = new StdClass(); $oGuiaGerar->id_importacao_desif = $aReceitasDesif->id_importacao_desif; $oGuiaGerar->id_importacao_desif_conta = $aReceitasDesif->id_importacao_desif_conta; $oGuiaGerar->inscricao_municipal = $oUsuarioContribuinte->getIm(); $oGuiaGerar->cpf = $iCpf; $oGuiaGerar->cnpj = $iCnpj; $oGuiaGerar->numcgm = $oUsuarioContribuinte->getCgm(); $oGuiaGerar->mes_competencia = $iMesCompetencia; $oGuiaGerar->ano_competencia = $iAnoCompetencia; $aListaReceitas = array(); foreach ($aReceitasDesif->aliquotas_issqn as $fAliquota => $aDadosReceita) { $sNumeroNotaFiscal = date('YmdHs', time()) . $aReceitasDesif->id_importacao_desif . str_replace('.', '', $fAliquota); $oReceita = new stdClass(); $oReceita->numero_nota_fiscal = $sNumeroNotaFiscal; $oReceita->codigo_documento = $aReceitasDesif->id_importacao_desif; $oReceita->data_nota_fiscal = $aReceitasDesif->data_importacao->format('Y-m-d'); $oReceita->serie_nota_fiscal = NULL; $oReceita->valor_base_calculo = $aDadosReceita['total_receita']; $oReceita->valor_deducao = 0; $oReceita->valor_imposto_retido = $aDadosReceita['total_iss']; $oReceita->valor_servico_prestado = $aDadosReceita['total_receita']; $oReceita->aliquota = $fAliquota; $oReceita->data_pagamento = $sDataPagamento; $oReceita->retido = $aDadosReceita['total_iss']; $oReceita->situacao = 1; $oReceita->status = 1; $oReceita->servico_prestado = 'Receita Importada Desif'; $oReceita->cnpj_prestador = $oUsuarioContribuinte->getCnpjCpf(); $oReceita->inscricao_prestador = $oUsuarioContribuinte->getIm(); $oReceita->nome = $oContribuinte->getNome(); $oReceita->operacao = 2; $aListaReceitas[] = $oReceita; } $oGuiaGerar->notas = $aListaReceitas; $aDados = array('planilha' => $oGuiaGerar, 'data_pagamento' => $oData->format('Y-m-d'), 'tipo_debito' => Contribuinte_Model_GuiaEcidade::TIPO_DEBITO_VARIAVEL); $oGuiaGerada = WebService_Model_Ecidade::processar('geraDebitoIssContribribuinte', $aDados); $oGuia = new Contribuinte_Model_Guia(); $oGuia->gerarGuiaDesifPrestador($oContribuinte, $oGuiaGerada, $iAnoCompetencia, $iMesCompetencia, $oDataPagamento); $sArquivoGuiaPdf = $oGuiaGerada->debito->dados_boleto->arquivo_guia; if ($lGerarPdf) { $oGuiaGerada->arquivo_guia = Contribuinte_Model_GuiaEcidade::salvarPdf($sArquivoGuiaPdf, 'guia_substituto'); } return $oGuiaGerada; }
/** * 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; } }