/** * Valida e salva as informações do RPS na base de dados * * @throws Exception * @return integer|NULL */ public function processarImportacaoRps() { // Dados da sessão $oSessao = new Zend_Session_Namespace('nfse'); $oDoctrine = Zend_Registry::get('em'); $oDoctrine->getConnection()->beginTransaction(); try { // Dados da importação $oImportacao = new \Contribuinte\ImportacaoArquivo(); $oImportacao->setData(new DateTime()); $oImportacao->setHora(new DateTime()); $oImportacao->setTipo('RPS'); $oImportacao->setQuantidadeDocumentos($this->oImportacao->lote->quantidade_rps); $oImportacao->setVersaoLayout('modelo1'); $oImportacao->setIdUsuario($this->iUsuarioLogado); $oImportacao->setNumeroLote($this->oImportacao->lote->numero); // Totalizadores $fValorTotalServico = 0; $fValorTotalImpostos = 0; // Processa a lista de rps foreach ($this->oImportacao->rps as $oRps) { if ($oRps->servico->valores->valor_iss_retido > 0) { $oRps->servico->valores->valor_iss = $oRps->servico->valores->valor_iss_retido; $oRps->servico->valores->iss_retido = 1; } $oContribuinte = Contribuinte_Model_Contribuinte::getByCpfCnpj($oRps->prestador->cnpj); $iInscricaoMunicipal = $oContribuinte->getInscricaoMunicipal(); // Dados dos Usuários $aDados['id_contribuinte'] = $oSessao->contribuinte->getIdUsuarioContribuinte(); $aDados['id_usuario'] = $this->iUsuarioLogado; // Dados da RPS $aDados['grupo_nota'] = Contribuinte_Model_Nota::GRUPO_NOTA_RPS; $aDados['tipo_nota'] = $oRps->tipo; $aDados['n_rps'] = $oRps->numero; $aDados['data_rps'] = $oRps->data_emissao; $aDados['dt_nota'] = $oRps->data_emissao; $aDados['hr_nota'] = $oRps->data_emissao; $aDados['ano_comp'] = $oRps->data_emissao->format('Y'); $aDados['mes_comp'] = $oRps->data_emissao->format('m'); $aDados['natureza_operacao'] = $oRps->natureza_operacao; // Dados do Prestador $aDados['p_im'] = $iInscricaoMunicipal; $aDados['p_cnpjcpf'] = $oRps->prestador->cnpj; // Dados do Tomador $aDados['t_cnpjcpf'] = $oRps->tomador->cpf_cnpj; $aDados['t_razao_social'] = $oRps->tomador->razao_social; $aDados['t_cep'] = $oRps->tomador->endereco->cep; $aDados['t_endereco'] = $oRps->tomador->endereco->descricao; $aDados['t_endereco_numero'] = $oRps->tomador->endereco->numero; $aDados['t_endereco_comp'] = $oRps->tomador->endereco->complemento; $aDados['t_bairro'] = $oRps->tomador->endereco->bairro; $aDados['t_cod_municipio'] = $oRps->tomador->endereco->ibge_municipio; $aDados['t_uf'] = $oRps->tomador->endereco->uf; $aDados['t_telefone'] = $oRps->tomador->contato->telefone; $aDados['t_email'] = $oRps->tomador->contato->email; // Dados da construção civil $aDados['s_codigo_obra'] = $oRps->construcao_civil->codigo_obra; $aDados['s_art'] = $oRps->construcao_civil->art; // Dados do Serviço $iAtividade = $oRps->servico->atividade; $oServico = Contribuinte_Model_Servico::getServicoPorAtividade($iInscricaoMunicipal, $iAtividade); if (empty($oServico)) { throw new Exception('O código de atividade do serviço inválido.'); } $aDados['descricao'] = $oRps->servico->discriminacao; $aDados['s_dados_cod_tributacao'] = $oServico->attr('cod_atividade'); $aDados['s_dados_cod_municipio'] = $oRps->servico->ibge_municipio; $aDados['s_dados_municipio_incidencia'] = $oRps->servico->ibge_municipio; $aDados['s_dados_cod_pais'] = 1058; //brasil // Verifica se o tomador retem o ISS $lTomadorRetemIss = $oRps->servico->valores->iss_retido == 1 ? TRUE : FALSE; // Valores do Serviço $aDados['s_vl_servicos'] = self::converterValor($oRps->servico->valores->valor_servicos); $aDados['s_vl_deducoes'] = self::converterValor($oRps->servico->valores->valor_deducoes); $aDados['s_vl_pis'] = self::converterValor($oRps->servico->valores->valor_pis); $aDados['s_vl_cofins'] = self::converterValor($oRps->servico->valores->valor_cofins); $aDados['s_vl_inss'] = self::converterValor($oRps->servico->valores->valor_inss); $aDados['s_vl_ir'] = self::converterValor($oRps->servico->valores->valor_ir); $aDados['s_vl_csll'] = self::converterValor($oRps->servico->valores->valor_csll); $aDados['s_vl_iss'] = self::converterValor($oRps->servico->valores->valor_iss); $aDados['s_dados_iss_retido'] = $lTomadorRetemIss ? 1 : 0; $aDados['s_vl_outras_retencoes'] = self::converterValor($oRps->servico->valores->outras_retencoes); $aDados['s_vl_bc'] = self::converterValor($oRps->servico->valores->base_calculo); $aDados['s_vl_aliquota'] = self::converterValor($oRps->servico->valores->aliquota * 100); $aDados['s_vl_liquido'] = self::converterValor($oRps->servico->valores->valor_liquido); $aDados['vl_liquido_nfse'] = self::converterValor($oRps->servico->valores->valor_liquido); $aDados['s_vl_condicionado'] = self::converterValor($oRps->servico->valores->desconto_condicionado); $aDados['s_vl_desc_incondicionado'] = self::converterValor($oRps->servico->valores->desconto_incondicionado); // Salva o RPS $oNotaRps = new Contribuinte_Model_Nota(); $oNotaRps->persist($aDados); // Adiciona os documento aos dados da importação $oImportacaoArquivoDocumento = new \Contribuinte\ImportacaoArquivoDocumento(); $oImportacaoArquivoDocumento->setImportacaoDms($oImportacao); $oImportacaoArquivoDocumento->addNota($oNotaRps->getEntity()); $oImportacaoArquivoDocumento->setValorImposto($oRps->servico->valores->valor_iss); $oImportacaoArquivoDocumento->setValorTotal($oRps->servico->valores->valor_servicos); // Vincula o documento aos dados da importação $oImportacao->addImportacaoArquivoDocumentos($oImportacaoArquivoDocumento); // Incrementa os totalizadores $fValorTotalServico += $oRps->servico->valores->valor_servicos; $fValorTotalImpostos += $oRps->servico->valores->valor_iss; } // Completa e salva os dados da importação $oImportacao->setValorTotal($fValorTotalServico); $oImportacao->setValorImposto($fValorTotalImpostos); $oDoctrine->persist($oImportacao); $oDoctrine->flush(); $oDoctrine->getConnection()->commit(); return $oImportacao; } catch (Exception $oErro) { $oDoctrine->getConnection()->rollback(); throw new Exception('Ocorreu um erro ao importar o arquivo: ' . $oErro->getMessage()); } }
/** * 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; }