/**
  * Processa os dados do formulário de importação de RPS [json]
  * 
  * @return void
  */
 public function rpsProcessarAction()
 {
     parent::noLayout();
     $oForm = new Contribuinte_Form_ImportacaoArquivo();
     $oForm->renderizaCamposRPS();
     // Adiciona a validação do arquivo junto ao restante das mensagens de erro do form
     $aDados = array_merge($this->getRequest()->getPost(), array('isUploaded' => $oForm->arquivo->isUploaded()));
     // Valida o formulario e processa a importação
     if ($this->getRequest()->isPost() && $oForm->arquivo->isUploaded()) {
         $oArquivoUpload = new Zend_File_Transfer_Adapter_Http();
         try {
             $oArquivoUpload->setDestination(APPLICATION_PATH . '/../public/tmp/');
             // Confirma o upload e processa o arquivo
             if ($oArquivoUpload->receive()) {
                 $oImportacaoModelo1 = new Contribuinte_Model_ImportacaoArquivoRpsModelo1();
                 $oImportacaoModelo1->setArquivoCarregado($oArquivoUpload->getFileName());
                 $oArquivoCarregado = $oImportacaoModelo1->carregar();
                 if ($oArquivoCarregado != NULL && $oImportacaoModelo1->validaArquivoCarregado()) {
                     // Valida as regras de negócio e processa a importação
                     $oImportacaoProcessamento = new Contribuinte_Model_ImportacaoArquivoProcessamento();
                     $oImportacaoProcessamento->setCodigoUsuarioLogado($this->usuarioLogado->getId());
                     $oImportacaoProcessamento->setArquivoCarregado($oArquivoCarregado);
                     // Processa a importação
                     $oImportacao = $oImportacaoProcessamento->processarImportacaoRps();
                     if ($oImportacao->getId()) {
                         $sUrlRecibo = "/contribuinte/importacao-arquivo/rps-recibo/id/{$oImportacao->getId()}";
                         $aRetornoJson['status'] = TRUE;
                         $aRetornoJson['url'] = $this->view->baseUrl($sUrlRecibo);
                         $aRetornoJson['success'] = $this->translate->_('Arquivo importado com sucesso.');
                     } else {
                         throw new Exception($this->translate->_('Ocorreu um erro ao importar o arquivo.'));
                     }
                 } else {
                     throw new Exception($oImportacaoModelo1->processaErroSistema());
                 }
             }
         } catch (DBSeller_Exception_ImportacaoXmlException $oErro) {
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['error'] = array_merge(array('<b>' . $this->translate->_('Ocorreu um erro ao importar o arquivo:') . '</b><br>'), $oErro->getErrors());
         } catch (Exception $oErro) {
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['error'][] = $oErro->getMessage();
         }
         if (is_file($oArquivoUpload->getFileName())) {
             unlink($oArquivoUpload->getFileName());
         }
     } else {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['fields'] = array_keys($oForm->getMessages());
         $aRetornoJson['error'][] = $this->translate->_('Preencha os dados corretamente.');
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
コード例 #2
0
 /**
  * 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;
     }
 }