/** * 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()); } }
/** * Método abstrato para validar o formulário em ambos os relatórios * * @return array|boolean */ protected function validarFormulario() { $aDados = $this->getRequest()->getPost(); $aRetornoErros = array(); $oForm = new Fiscal_Form_Relatorio6(); $oForm->render(); // Verifica se os parâmetros do formulário são válidos if ($oForm->isValid($aDados)) { // Parâmetros do formulário $sCompetenciaInicial = $oForm->getValue('data_competencia_inicial'); $sCompetenciaFinal = $oForm->getValue('data_competencia_final'); $sPrestadorCnpj = $oForm->getValue('prestador_cnpj'); // Valida se é cadastrado e se é prestador de servico $oPrestador = Contribuinte_Model_Contribuinte::getByCpfCnpj($sPrestadorCnpj); if (!$oPrestador instanceof Contribuinte_Model_Contribuinte) { $sMensagemErro = $this->translate->_('Contribuinte não cadastrado no sistema.'); $aRetornoErros['status'] = FALSE; $aRetornoErros['fields'] = array('prestador_cnpj'); $aRetornoErros['error'][] = $this->translate->_($sMensagemErro); return $aRetornoErros; } else { if (!Contribuinte_Model_Servico::getByIm($oPrestador->getInscricaoMunicipal())) { $sMensagemErro = $this->translate->_('O contribuinte não é prestador de serviços.'); $aRetornoErros['status'] = FALSE; $aRetornoErros['fields'] = array('prestador_cnpj'); $aRetornoErros['error'][] = $this->translate->_($sMensagemErro); return $aRetornoErros; } } // Objeto para validação das competências inicial e final $oValidaCompetencia = new DBSeller_Validator_Competencia(); $oValidaCompetencia->setCompetenciaInicial($sCompetenciaInicial); $oValidaCompetencia->setCompetenciaFinal($sCompetenciaFinal); // Valida a competência inicial e final if (!$oValidaCompetencia->isValid($sCompetenciaInicial)) { $aRetornoErros['status'] = FALSE; $aRetornoErros['fields'] = array('data_competencia_inicial', 'data_competencia_final'); $aMensagensErro = $oValidaCompetencia->getMessages(); $aIndicesErro = array_keys($aMensagensErro); foreach ($aIndicesErro as $sIndiceErro) { if (array_key_exists($sIndiceErro, $aMensagensErro)) { $aRetornoErros['error'][] = $this->translate->_($aMensagensErro[$sIndiceErro]); } } return $aRetornoErros; } return TRUE; } else { $aCamposComErro = array_keys($oForm->getMessages()); $sMensagemErro = $this->translate->_('Preencha os dados corretamente.'); if (count($aCamposComErro) > 1) { $sMensagemErro = $this->translate->_('Preencha os dados corretamente.'); } else { if (in_array('data_competencia_final', $aCamposComErro)) { $sMensagemErro = $this->translate->_('Informe a Competência Final corretamente.'); } else { if (in_array('data_competencia_inicial', $aCamposComErro)) { $sMensagemErro = $this->translate->_('Informe a Competência Inicial corretamente.'); } } } $aRetornoErros['status'] = FALSE; $aRetornoErros['fields'] = array_keys($oForm->getMessages()); $aRetornoErros['error'][] = $this->translate->_($sMensagemErro); } return $aRetornoErros; }
/** * 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; }
/** * metodo responsável por gerar as permissoes do usuario * * @return Administrativo_Model_UsuarioContribuinte */ protected function definePermissoes() { if ($this->getId() == null) { // verifica se o tipo de usuário é Contador e e se for vincula as empresas enviadas pelo e-cidade if ($this->getTipo() == Administrativo_Model_TipoUsuario::$CONTADOR) { $empresas = Administrativo_Model_Empresa::getByCnpj($this->getCnpj()); // vincula ações de contribuintes $this->vinculaEmpresas($empresas); } // verifica se o usuário é do tipo Contribuinte para vincular a empresa if ($this->getTipo() == Administrativo_Model_TipoUsuario::$CONTRIBUINTE) { $oEmpresa = Contribuinte_Model_Contribuinte::getByCpfCnpj($this->getCnpj()); if (!empty($oEmpresa)) { $uc = new Administrativo_Model_UsuarioContribuinte(); $uc->setIm($oEmpresa->getInscricaoMunicipal()); $uc->setUsuario($this->entity); $uc->setHabilitado(true); $this->addUsuarioContribuinte($uc); } } // vincula ações administrativas $acoes = $this->getPerfil()->getAcoes(); $acoes_adm = array(); foreach ($acoes as $a) { if (strtolower($a->getControle()->getModulo()->getNome()) == 'administrativo' || $a->getId() == 37) { $acoes_adm[] = $a; } } $this->adicionaAcoes($acoes_adm); } return $this; }
/** * Importacao de arquivo [Json] * * @throws Exception */ public function processarArquivoAction() { parent::noLayout(); $oFormImportacaoDms = new Contribuinte_Form_ImportacaoArquivo(); $oFormImportacaoDms->renderizaCamposDms(); $oDoctrine = Zend_Registry::get('em'); $oDoctrine->getConnection()->beginTransaction(); try { // Id do usuário logado $oContador = $this->oUsuario; $iCodigoUsuario = $this->usuarioLogado->getId(); $oContribuinteLogado = $this->oContribuinte; $oImportacao = new Contribuinte_Model_ImportacaoDms(); if (!$oFormImportacaoDms->arquivo->isUploaded()) { throw new Exception($this->translate->_('Informe um arquivo válido.')); } $sArquivoPdfBase64 = base64_encode(file_get_contents($_FILES['arquivo']['tmp_name'])); $sNomeArquivo = $_FILES['arquivo']['name']; // Seta a inscrição municipal do contribuinte, caso seja contador seta nulo $oRetorno = Contribuinte_Model_ImportarDmsEcidade::processarArquivo($oContador, $oContribuinteLogado, $sArquivoPdfBase64); if ($oRetorno->bStatus == FALSE) { throw new Exception($oRetorno->sMensagem); } if (!is_array($oRetorno->aDados)) { $sMensagem = 'Arquivo processado de forma incorreta! Favor entre em contato com o suporte.'; throw new Exception($this->translate->_($sMensagem)); } // Varre os contadores / escritórios $oEscritorio = NULL; $aImportacaoNotas = NULL; $fValorTotalImportado = NULL; $fValorTotalImpostoImportado = NULL; $iQuantidadeNotas = NULL; foreach ($oRetorno->aDados['contadores'] as $aContadores) { // Dados do contador / escritório $oEscritorio = isset($aContadores['dados']) ? $aContadores['dados'] : NULL; if (!isset($aContadores['contribuintes']) || count($aContadores) < 1) { throw new Exception('Arquivo inconsistente, não foi encontrado contribuintes.'); } // Varre os contribuintes do contador foreach ($aContadores['contribuintes'] as $aContribuintes) { // Totalizadores $fValorTotalImpostoImportado = 0; $fValorTotalImportado = 0; $iQuantidadeNotas = 0; $iTotalImportadas = 0; // Dados $aPlanilhas = $aContribuintes['planilha']; // Varre as planilhas do contribuinte foreach ($aPlanilhas as $sOperacao => $oPlanilha) { if (isset($oPlanilha->aNotas) && count($oPlanilha->aNotas) > 0) { $oContribuinte = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($oPlanilha->iInscricao); $oDms = new Contribuinte_Model_Dms(); $oDms->setAnoCompetencia($oPlanilha->iAnoCompetencia); $oDms->setMesCompetencia($oPlanilha->iMesCompetencia); $oDms->setDataOperacao(new DateTime($oPlanilha->dtDatausu)); $oDms->setStatus('aberto'); $oDms->setOperacao($sOperacao); $oDms->setIdContribuinte($oContribuinte->getIdUsuarioContribuinte()); $oDms->setIdUsuario($iCodigoUsuario); // Verifica se existe notas para o contribuinte if (isset($aContribuintes['notas'][$sOperacao])) { // Varre as notas do contribuinte foreach ($aContribuintes['notas'][$sOperacao] as $oNota) { // Dados Nota $oGrupoDocumento = Contribuinte_Model_Nota::getTipoNota($oNota->iCodigoTipoNota); $oDmsNota = new Contribuinte_Model_DmsNota(); $oDmsNota->setNotaNumero($oNota->sNumeroNota); $oDmsNota->setNotaSerie($oNota->sSerie); $oDmsNota->setNotaData(new DateTime(date('Y-m-d', $oNota->sDataEmissao->iTimeStamp))); $oDmsNota->setGrupoDocumento($oGrupoDocumento->codigo_grupo); $oDmsNota->setTipoDocumento($oNota->iCodigoTipoNota); $oDmsNota->setSituacaoDocumento($oNota->sSituacao); $oDmsNota->setEmiteGuia($oNota->lEmiteGuia); // Dados Servico $bTomadorPagaIss = empty($oNota->bRetido) ? FALSE : TRUE; // Formatada dados $dServicoData = new DateTime(date('Y-m-d', $oNota->sDataPrestacao->iTimeStamp)); // Validação dos valores das notas $oValidacaoValores = Contribuinte_model_dms::emissaoManualCalculaValoresDms($bTomadorPagaIss, DBSeller_Helper_Number_Format::toMoney($oNota->fValorServico), DBSeller_Helper_Number_Format::toMoney($oNota->fValorDeducao), DBSeller_Helper_Number_Format::toMoney($oNota->fValorDescontoCondicional), DBSeller_Helper_Number_Format::toMoney($oNota->fValorDescontoIncondicional), DBSeller_Helper_Number_Format::toMoney($oNota->fValorAliquota)); // Verifica valores do imposto if (DBSeller_Helper_Number_Format::toMoney($oNota->fValorBaseCalculo) != $oValidacaoValores['s_base_calculo'] || DBSeller_Helper_Number_Format::toMoney($oNota->fValorIssqn) != $oValidacaoValores['s_valor_imposto']) { $sMensagem = 'Arquivo possui valores inconsistentes!<br>'; $sMensagem .= "Nota: {$oNota->sNumeroNota} Série: {$oNota->sSerie}"; throw new Exception($this->translate->_($sMensagem)); } // Dados do documento de DMS $oDmsNota->setServicoData($dServicoData); $oDmsNota->setServicoImpostoRetido($bTomadorPagaIss); $oDmsNota->setServicoCodigoServico($oNota->iCodigoAtividade); $oDmsNota->setDescricaoServico($oNota->sDescricaoServico); $oDmsNota->setServicoValorPagar($oNota->fValorServico); $oDmsNota->setServicoValorLiquido($oNota->fValorNota); $oDmsNota->setServicoValorDeducao($oNota->fValorDeducao); $oDmsNota->setServicoValorCondicionado($oNota->fValorDescontoCondicional); $oDmsNota->setServicoDescontoIncondicionado($oNota->fValorDescontoIncondicional); $oDmsNota->setServicoBaseCalculo($oNota->fValorBaseCalculo); $oDmsNota->setServicoValorAliquota($oNota->fValorAliquota); $oDmsNota->setServicoValorImposto($oNota->fValorIssqn); $oDmsNota->setNumpre(0); // Campos novos $oDmsNota->setNaturezaOperacao($oNota->iNaturezaOperacao); $oDmsNota->setServicoCodigoObra($oNota->sCodigoObra); $oDmsNota->setServicoArt($oNota->sArt); $oDmsNota->setServicoInformacoesComplementares($oNota->sInformacoesComplementares); // Verifica a operação if (strtolower($sOperacao) == Contribuinte_Model_Dms::SAIDA) { $iInscricaoPrestador = $oPlanilha->iInscricao; $sCpfCnpjTomador = $oNota->iCpfCnpjTomador; $oDadosPrestador = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($iInscricaoPrestador); } else { $oDadosPrestador = Contribuinte_Model_Contribuinte::getByCpfCnpj($oNota->iCpfCnpjTomador); $sCpfCnpjTomador = $oContribuinte->getCgcCpf(); } // Verifica o prestador if (empty($oDadosPrestador)) { $sMensagem = 'Arquivo processado de forma incorreta!<br>Existem contribuinte inválidos.'; throw new Exception($this->translate->_($sMensagem)); } // Serviços prestados if (strtolower($sOperacao) == Contribuinte_Model_Dms::SAIDA) { $oDmsNota->setPrestadorCpfCnpj($oDadosPrestador->getCgcCpf()); $oDmsNota->setPrestadorInscricaoMunicipal($oDadosPrestador->getInscricaoMunicipal()); $oDmsNota->setPrestadorInscricaoEstadual($oDadosPrestador->getInscricaoEstadual()); $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()); } else { // Dados Prestador $oDadosPrestador = Contribuinte_Model_Empresa::getByCgcCpf($oNota->iCpfCnpjTomador); // Verifica se é prestador do eCidade e NFSe if (is_object($oDadosPrestador) && isset($oDadosPrestador->eCidade)) { $oDadosPrestador = $oDadosPrestador->eCidade[0]; $oDmsNota->setPrestadorCpfCnpj($oNota->iCpfCnpjTomador); $oDmsNota->setPrestadorRazaoSocial($oDadosPrestador->attr('nome')); $oDmsNota->setPrestadorNomeFantasia($oDadosPrestador->attr('nome_fanta')); $oDmsNota->setPrestadorInscricaoMunicipal($oDadosPrestador->attr('inscricao')); $oDmsNota->setPrestadorInscricaoEstadual($oDadosPrestador->attr('inscr_est')); $oDmsNota->setPrestadorEnderecoRua($oDadosPrestador->attr('logradouro')); $oDmsNota->setPrestadorEnderecoNumero($oDadosPrestador->attr('numero')); $oDmsNota->setPrestadorEnderecoComplemento($oDadosPrestador->attr('complemento')); $oDmsNota->setPrestadorEnderecoBairro($oDadosPrestador->attr('bairro')); $oDmsNota->setPrestadorEnderecoCodigoMunicipio($oDadosPrestador->attr('cod_ibge')); $oDmsNota->setPrestadorEnderecoEstado($oDadosPrestador->attr('uf')); $oDmsNota->setPrestadorEnderecoCodigoPais($oDadosPrestador->attr('cod_pais')); $oDmsNota->setPrestadorEnderecoCEP($oDadosPrestador->attr('cep')); $oDmsNota->setPrestadorTelefone($oDadosPrestador->attr('telefone')); $oDmsNota->setPrestadorEmail($oDadosPrestador->attr('email')); } else { $oDmsNota->setPrestadorCpfCnpj($oNota->iCpfCnpjTomador); $oDmsNota->setPrestadorRazaoSocial($oNota->sNomeRazaoSocial); $oDmsNota->setPrestadorNomeFantasia($oNota->sNomeRazaoSocial); } } // Dados Tomador $oDadosTomador = Contribuinte_Model_Empresa::getByCgcCpf($sCpfCnpjTomador); // Verifica se é tomador do eCidade e NFSe if (is_object($oDadosTomador) && isset($oDadosTomador->eCidade)) { $oDadosTomador = $oDadosTomador->eCidade[0]; $oDmsNota->setTomadorCpfCnpj($oDadosTomador->attr('cpf')); $oDmsNota->setTomadorRazaoSocial($oDadosTomador->attr('nome')); $oDmsNota->setTomadorNomeFantasia($oDadosTomador->attr('nome_fanta')); $oDmsNota->setTomadorInscricaoMunicipal($oDadosTomador->attr('inscricao')); $oDmsNota->setTomadorInscricaoEstadual($oDadosTomador->attr('inscr_est')); $oDmsNota->setTomadorEnderecoRua($oDadosTomador->attr('logradouro')); $oDmsNota->setTomadorEnderecoNumero($oDadosTomador->attr('numero')); $oDmsNota->setTomadorEnderecoComplemento($oDadosTomador->attr('complemento')); $oDmsNota->setTomadorEnderecoBairro($oDadosTomador->attr('bairro')); $oDmsNota->setTomadorEnderecoCodigoMunicipio($oDadosTomador->attr('cod_ibge')); $oDmsNota->setTomadorEnderecoEstado($oDadosTomador->attr('uf')); $oDmsNota->setTomadorEnderecoCodigoPais($oDadosTomador->attr('cod_pais')); $oDmsNota->setTomadorEnderecoCEP($oDadosTomador->attr('cep')); $oDmsNota->setTomadorTelefone($oDadosTomador->attr('telefone')); $oDmsNota->setTomadorEmail($oDadosTomador->attr('email')); } else { if (!isset($oDadosTomador->eNota)) { $aDadosTomador['t_cnpjcpf'] = $sCpfCnpjTomador; $aDadosTomador['t_razao_social'] = $oNota->sNomeRazaoSocial; $oDadosTomador = new Contribuinte_Model_EmpresaBase(); $oDadosTomador->persist($aDadosTomador); $oDmsNota->setTomadorCpfCnpj($oNota->iCpfCnpjTomador); $oDmsNota->setTomadorRazaoSocial($oNota->sNomeRazaoSocial); } } // Dados dos usuário e contribuinte $oDmsNota->setIdUsuario($iCodigoUsuario); $oDmsNota->setIdContribuinte($oContribuinte->getIdUsuarioContribuinte()); // Incrementa os valores $fValorTotalImpostoImportado = $fValorTotalImpostoImportado + $oNota->fValorIssqn; $fValorTotalImportado = $fValorTotalImportado + $oNota->fValorNota; $iQuantidadeNotas++; // Se for serviço prestado, verifica se a quantidade de AIDOFs é suficiente para importação if (strtolower($sOperacao) == Contribuinte_Model_Dms::SAIDA) { $iTotalNotasImportadas = count($aContribuintes['notas'][$sOperacao]); $iTotalImportadas = $iTotalImportadas + 1; $oAidof = new Administrativo_Model_Aidof(); $iQuantidadeNotasEmissao = $oAidof->getQuantidadesNotasEmissao($oPlanilha->iInscricao, $oNota->iCodigoTipoNota); $iQuantidadeLiberada = $iQuantidadeNotasEmissao - $iTotalImportadas; if ($iQuantidadeLiberada <= 0) { $sMensagem = 'Você não possui AIDOFs liberadas para importar os documentos.'; $sMensagem = sprintf($sMensagem, $iQuantidadeLiberada, $iTotalNotasImportadas); throw new Exception($this->translate->_($sMensagem)); } else { if ($iQuantidadeLiberada < $iTotalNotasImportadas) { $sMensagem = 'Você possui apenas "%s" AIDOFs liberadas para importar "%s" documentos.'; $sMensagem = sprintf($sMensagem, $iQuantidadeLiberada, $iTotalNotasImportadas); throw new Exception($this->translate->_($sMensagem)); } } // Valida se a numeração da nota está no intervalo confere com as AIDOF liberadas $lNumeracaoNotaConfereComAidofLiberada = $oAidof->verificarNumeracaoValidaParaEmissaoDocumento($oDmsNota->getPrestadorInscricaoMunicipal(), $oDmsNota->getNotaNumero(), $oDmsNota->getTipoDocumento()); if (!$lNumeracaoNotaConfereComAidofLiberada) { $sMensagem = 'O número do documento "%s" não confere com a numeração permitida pelas AIDOF\'s.'; throw new Exception($this->translate->_(sprintf($sMensagem, $oDmsNota->getNotaNumero()))); } } // Verifica se ja existe o documento, ignora e anula a planilha if ($oDmsNota::checarNotaEmitida($oContribuinte, $oNota->iCodigoTipoNota, $oNota->sNumeroNota, NULL, $sOperacao)) { $sMensagem = 'O documento nº "%s" já consta na base de dados do sistema.'; throw new Exception($this->translate->_(sprintf($sMensagem, $oNota->sNumeroNota))); } else { // Adiciona as notas no DMS $oDmsNota->setDms($oDms->getEntity()); $oDms->addDmsNotas($oDmsNota->getEntity()); } // Formata os dados $sCompetenciaImportacao = $oPlanilha->iMesCompetencia . '-' . $oPlanilha->iAnoCompetencia; // Adiciona os dados do documento na importação $oImportacaoNotas = new Contribuinte_Model_ImportacaoDmsNota(); $oImportacaoNotas->setNumeroNota($oNota->sNumeroNota); $oImportacaoNotas->setTipoNota($oNota->iCodigoTipoNota); $oImportacaoNotas->setValorTotal($oDmsNota->getServicoValorPagar()); $oImportacaoNotas->setValorImposto($oNota->fValorIssqn); $oImportacaoNotas->setOperacaoNota($sOperacao); $oImportacaoNotas->setDataEmissaoNota($oDmsNota->getNotaData()); $oImportacaoNotas->setCompetencia($sCompetenciaImportacao); $oImportacaoNotas->setIdContribuinte($oContribuinte->getIdUsuarioContribuinte()); // Adiciona os dados na lista da importação $aImportacaoNotas[] = $oImportacaoNotas; } } } else { $sMensagem = 'Nenhum documento foi encontrado para importar.'; throw new Exception($this->translate->_($sMensagem)); } // Salva o DMS $aCodigosDms[] = $oDms->persist(); } } } // Formata os dados $sCodigoEscritorio = isset($oEscritorio->iInscricaoMunicipal) ? $oEscritorio->iInscricaoMunicipal : NULL; // Prepara informações da importacao $oImportacao->setDataOperacao(new DateTime()); $oImportacao->setValorTotal($fValorTotalImportado); $oImportacao->setValorImposto($fValorTotalImpostoImportado); $oImportacao->setNomeArquivo($sNomeArquivo); $oImportacao->setQuantidadeNotas($iQuantidadeNotas); $oImportacao->setIdUsuario($iCodigoUsuario); $oImportacao->setCodigoEscritorio($sCodigoEscritorio); if (is_array($aImportacaoNotas)) { foreach ($aImportacaoNotas as $oNotaImportada) { $oNotaImportada->setImportacaoDms($oImportacao->getEntity()); $oImportacao->addImportacaoNotas($oNotaImportada->getEntity()); } } // Salva log de importação $iCodigoImportacao = $oImportacao->persist(); // Retorno em Json $aRetornoJson['status'] = $oRetorno->bStatus; $aRetornoJson['success'] = $oRetorno->sMensagem; $aRetornoJson['url'] = $this->view->baseUrl("/contribuinte/dms/comprovante/id/{$iCodigoImportacao}"); $oDoctrine->getConnection()->commit(); echo $this->getHelper('json')->sendJson($aRetornoJson); } catch (Exception $oErro) { $oDoctrine->getConnection()->rollback(); $aRetornoJson['status'] = FALSE; $aRetornoJson['error'][] = $oErro->getMessage(); echo $this->getHelper('json')->sendJson($aRetornoJson); return; } }