/** * 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; } }