Skip to content

Commit

Permalink
fix: tratamento para recebimento de processos contendo documentos rep…
Browse files Browse the repository at this point in the history
…etidos no processo
  • Loading branch information
guilhermeadc committed May 3, 2023
1 parent 3e5306b commit a4e29bd
Show file tree
Hide file tree
Showing 11 changed files with 1,437 additions and 171 deletions.
49 changes: 9 additions & 40 deletions src/rn/ExpedirProcedimentoRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -479,17 +479,16 @@ private function registrarAndamentoExpedicaoProcesso($objExpedirProcedimentoDTO,
}

private function construirCabecalho(ExpedirProcedimentoDTO $objExpedirProcedimentoDTO, $strNumeroRegistro, $dblIdProcedimento = null){
if(!isset($objExpedirProcedimentoDTO)){
throw new InfraException('Parâmetro $objExpedirProcedimentoDTO não informado.');
}
if(!isset($objExpedirProcedimentoDTO)){
throw new InfraException('Parâmetro $objExpedirProcedimentoDTO não informado.');
}

// Atenção: Comportamento desativado até que seja tratado o recebimento de um processo recebendo um novo documento
// com mesmo arquivo/hash de outro documento já existente no processo
// $bolObrigarEnvioDeTodosOsComponentesDigitais = !$this->enviarApenasComponentesDigitaisPendentes(
// $objExpedirProcedimentoDTO->getNumIdRepositorioDestino(),
// $objExpedirProcedimentoDTO->getNumIdUnidadeDestino()
// );
$bolObrigarEnvioDeTodosOsComponentesDigitais = true;
$bolObrigarEnvioDeTodosOsComponentesDigitais = !$this->enviarApenasComponentesDigitaisPendentes(
$objExpedirProcedimentoDTO->getNumIdRepositorioDestino(),
$objExpedirProcedimentoDTO->getNumIdUnidadeDestino()
);

return $this->objProcessoEletronicoRN->construirCabecalho(
$strNumeroRegistro,
Expand Down Expand Up @@ -1417,7 +1416,7 @@ private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAs
$strNomeComponenteDigital = "";
if($bolMultiplosComponentes){
$strCaminhoAnexoCompactado = $this->objAnexoRN->obterLocalizacao($objAnexoDTO);
list($strCaminhoAnexoTemporario, $strNomeComponenteDigital) = $this->descompactarComponenteDigital($strCaminhoAnexoCompactado, $numOrdemComponenteDigital);
list($strCaminhoAnexoTemporario, $strNomeComponenteDigital) = ProcessoEletronicoRN::descompactarComponenteDigital($strCaminhoAnexoCompactado, $numOrdemComponenteDigital);
$strCaminhoAnexo = $strCaminhoAnexoTemporario;
} else {
$strCaminhoAnexo = $this->objAnexoRN->obterLocalizacao($objAnexoDTO);
Expand Down Expand Up @@ -1537,36 +1536,6 @@ private function recuperarConteudoComponenteImutavel(DocumentoDTO $objDocumentoD
}


private function descompactarComponenteDigital($strCaminhoAnexoCompactado, $numOrdemComponenteDigital){

if(!is_readable($strCaminhoAnexoCompactado)) {
throw new InfraException("Anexo de documento não pode ser localizado");
}

$objAnexoRN = new AnexoRN();
$strNomeArquivoTemporario = DIR_SEI_TEMP . '/' . $objAnexoRN->gerarNomeArquivoTemporario();

$arrStrNomeArquivos = array();
$zipArchive = new ZipArchive();
if($zipArchive->open($strCaminhoAnexoCompactado)){
try {
for($i = 0; $i < $zipArchive->numFiles; $i++){
$arrStrNomeArquivos[] = $zipArchive->getNameIndex($i);
}

$strNomeComponenteDigital = $arrStrNomeArquivos[$numOrdemComponenteDigital - 1];
$strPathArquivoNoZip = "zip://".$strCaminhoAnexoCompactado."#".$strNomeComponenteDigital;
copy($strPathArquivoNoZip, $strNomeArquivoTemporario);
} finally {
$zipArchive->close();
}
} else {
throw new InfraException("Falha na leitura dos componentes digitais compactados em $strCaminhoAnexoCompactado");
}

return [$strNomeArquivoTemporario, $strNomeComponenteDigital];
}

private function obterDadosComplementaresDoTipoDeArquivo($strCaminhoAnexo, $arrPenMimeTypes, $strProtocoloDocumentoFormatado){
$strDadosComplementaresDoTipoDeArquivo = "";
$finfo = finfo_open(FILEINFO_MIME_TYPE);
Expand Down Expand Up @@ -2137,7 +2106,7 @@ private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $s
if($bolMultiplosComponentes){
$numOrdemComponenteDigital = $objComponenteDigitalDTO->getNumOrdem();
$strCaminhoAnexoCompactado = $this->objAnexoRN->obterLocalizacao($objAnexoDTO);
list($strCaminhoAnexoTemporario, ) = $this->descompactarComponenteDigital($strCaminhoAnexoCompactado, $numOrdemComponenteDigital);
list($strCaminhoAnexoTemporario, ) = ProcessoEletronicoRN::descompactarComponenteDigital($strCaminhoAnexoCompactado, $numOrdemComponenteDigital);
$strCaminhoAnexo = $strCaminhoAnexoTemporario;
} else {
$strCaminhoAnexo = $this->objAnexoRN->obterLocalizacao($objAnexoDTO);
Expand Down
31 changes: 31 additions & 0 deletions src/rn/ProcessoEletronicoRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -2171,6 +2171,37 @@ public function reduzirCampoTexto($parStrTexto, $parNumTamanho)
return $strTexto;
}

public static function descompactarComponenteDigital($strCaminhoAnexoCompactado, $numOrdemComponenteDigital){

if(!is_readable($strCaminhoAnexoCompactado)) {
throw new InfraException("Anexo de documento não pode ser localizado");
}

$objAnexoRN = new AnexoRN();
$strNomeArquivoTemporario = DIR_SEI_TEMP . '/' . $objAnexoRN->gerarNomeArquivoTemporario();

$arrStrNomeArquivos = array();
$zipArchive = new ZipArchive();
if($zipArchive->open($strCaminhoAnexoCompactado)){
try {
for($i = 0; $i < $zipArchive->numFiles; $i++){
$arrStrNomeArquivos[] = $zipArchive->getNameIndex($i);
}

$strNomeComponenteDigital = $arrStrNomeArquivos[$numOrdemComponenteDigital - 1];
$strPathArquivoNoZip = "zip://".$strCaminhoAnexoCompactado."#".$strNomeComponenteDigital;
copy($strPathArquivoNoZip, $strNomeArquivoTemporario);
} finally {
$zipArchive->close();
}
} else {
throw new InfraException("Falha na leitura dos componentes digitais compactados em $strCaminhoAnexoCompactado");
}

return [$strNomeArquivoTemporario, $strNomeComponenteDigital];
}


/**
* Recupera a lista de todos os documentos do processo, principal ou anexados, mantendo a ordem correta entre eles e indicando qual
* sua atual associação com o processo
Expand Down
16 changes: 7 additions & 9 deletions src/rn/ReceberComponenteDigitalRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,13 @@ public function atribuirComponentesDigitaisAoDocumento($parNumIdDocumento, $parA
// Caso possua, será necessário compactar todos os arquivos em ZIP para vinculação ao documento no SEI que
// permite apenas um arquivo por documento
$objAnexoDTODocumento = null;
if(count($arrObjAnexoDTOParaCompactacao) == 1){
$objAnexoDTODocumento = $arrObjAnexoDTOParaCompactacao[0];
}elseif (count($arrObjAnexoDTOParaCompactacao) > 1){
$objAnexoDTODocumento = self::compactarAnexosDoDocumento($parNumIdDocumento, $arrObjAnexoDTOParaCompactacao);
}else{
throw new InfraException("Anexo do documento $parNumIdDocumento não pode ser localizado.");
}
if(count($arrObjAnexoDTOParaCompactacao) == 1){
$objAnexoDTODocumento = $arrObjAnexoDTOParaCompactacao[0];
}elseif (count($arrObjAnexoDTOParaCompactacao) > 1){
$objAnexoDTODocumento = self::compactarAnexosDoDocumento($parNumIdDocumento, $arrObjAnexoDTOParaCompactacao);
}else{
throw new InfraException("Anexo do documento $parNumIdDocumento não pode ser localizado.");
}

//Transferir documentos validados para o repositório final de arquivos
$objAnexoDTODocumento->setDblIdProtocolo($parNumIdDocumento);
Expand Down Expand Up @@ -253,7 +253,6 @@ private function atualizarAnexoDoComponenteDigital($parObjComponenteDigitalDTO,
* @param $objComponenteDigital
* @return AnexoDTO
*
* Pelo que entendi, aqui os arquivos são gerados na pasta temporária.
*/
public function copiarComponenteDigitalPastaTemporaria($parObjComponenteDigital, $parObjConteudo)
{
Expand Down Expand Up @@ -375,6 +374,5 @@ public function cadastrarAnexoDoDocumento(AnexoDTO $parObjAnexoDTO)
$objProtocoloDTO->setArrObjAnexoDTO(array($parObjAnexoDTO));

$objDocumentoRN->alterarRN0004($objDocumentoDTO);

}
}
122 changes: 99 additions & 23 deletions src/rn/ReceberProcedimentoRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ private function atribuirComponentesDigitaisAosDocumentos(ProcedimentoDTO $parOb
$dblIdDocumento = $numIdDocumento;
$strHash = $objComponenteDigitalDTO->getStrHashConteudo();

//Verificar se documento já foi recebido anteriormente para poder registrar
//Verificar se documento já foi recebido anteriormente para poder registrar
if($this->documentosPendenteRegistro($dblIdProcedimento, $dblIdDocumento, $strHash)){
$this->objReceberComponenteDigitalRN->atribuirComponentesDigitaisAoDocumento($numIdDocumento, $arrObjComponenteDigitalDTO);
$strMensagemRecebimento = sprintf('Armazenando componente do documento %s', $objComponenteDigitalDTO->getStrProtocoloDocumentoFormatado());
Expand Down Expand Up @@ -1484,6 +1484,7 @@ private function atribuirDocumentos($parObjProcedimentoDTO, $parObjProtocolo, $o
//Obter dados dos documentos já registrados no sistema
$objComponenteDigitalDTO = new ComponenteDigitalDTO();
$objComponenteDigitalDTO->retNumOrdem();
$objComponenteDigitalDTO->retStrNome();
$objComponenteDigitalDTO->retDblIdProcedimento();
$objComponenteDigitalDTO->retDblIdDocumento();
$objComponenteDigitalDTO->retStrHashConteudo();
Expand Down Expand Up @@ -1512,12 +1513,14 @@ private function atribuirDocumentos($parObjProcedimentoDTO, $parObjProtocolo, $o

$objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco());
$arrObjComponenteDigitalDTO = $objComponenteDigitalBD->listar($objComponenteDigitalDTO);
$arrObjComponenteDigitalDTOIndexado = InfraArray::indexarArrInfraDTO($arrObjComponenteDigitalDTO, "OrdemDocumento");
$arrObjComponenteDigitalDTOIndexado = InfraArray::indexarArrInfraDTO($arrObjComponenteDigitalDTO, "OrdemDocumento", true);

$arrObjDocumentoDTO = array();
$arrDocumentosExistentesPorHash = array();
$arrIdDocumentosRetirados = array();
$count = count($arrObjDocumentos);
$this->gravarLogDebug("Quantidade de documentos para recebimento: $count", 2);

foreach($arrObjDocumentos as $objDocumento){
if(!isset($objDocumento->staTipoProtocolo) || $bolDocumentoAvulso) {

Expand All @@ -1526,13 +1529,23 @@ private function atribuirDocumentos($parObjProcedimentoDTO, $parObjProtocolo, $o
$numOrdemDocumento = $numOrdemDocumento ?: $objDocumento->ordem;

if(array_key_exists($numOrdemDocumento, $arrObjComponenteDigitalDTOIndexado)){
$objComponenteDigitalDTO = $arrObjComponenteDigitalDTOIndexado[$numOrdemDocumento];
$arrObjComponenteDigitalDTO = $arrObjComponenteDigitalDTOIndexado[$numOrdemDocumento];
$objComponenteDigitalDTO = count($arrObjComponenteDigitalDTO) > 0 ? $arrObjComponenteDigitalDTO[0] : $arrObjComponenteDigitalDTO;

$this->alterarMetadadosDocumento($objComponenteDigitalDTO->getDblIdProcedimento(), $objComponenteDigitalDTO->getDblIdDocumento(), $objDocumento);
$objDocumento->idDocumentoSEI = $objComponenteDigitalDTO->getDblIdDocumento();
$objDocumento->idProcedimentoSEI = $objComponenteDigitalDTO->getDblIdProcedimento();
$objDocumento->idProcedimentoAnexadoSEI = $objComponenteDigitalDTO->getDblIdProcedimentoAnexado();
$objDocumento->protocoloProcedimentoSEI = $objComponenteDigitalDTO->getStrProtocoloProcedimentoAnexado();

foreach ($arrObjComponenteDigitalDTO as $objComponenteDTO) {
$arrDocumentosExistentesPorHash[$objComponenteDTO->getStrHashConteudo()] = array(
"IdDocumento" => $objComponenteDTO->getDblIdDocumento(),
"ComponenteDigitalDTO" => $objComponenteDTO,
"MultiplosComponentes" => count($arrObjComponenteDigitalDTO) > 1
);
}

if(isset($objDocumento->retirado) && $objDocumento->retirado === true) {
$arrIdDocumentosRetirados[] = $objDocumento->idDocumentoSEI;
}
Expand Down Expand Up @@ -1672,35 +1685,41 @@ private function atribuirDocumentos($parObjProcedimentoDTO, $parObjProtocolo, $o
}
}

$arrObjParticipantesDTO = InfraArray::distinctArrInfraDTO($objDocumentoDTO->getObjProtocoloDTO()->getArrObjParticipanteDTO(), 'NomeContato');
$arrObjParticipantesDTO = $this->prepararParticipantes($arrObjParticipantesDTO);
$objDocumentoDTO->getObjProtocoloDTO()->setArrObjParticipanteDTO($arrObjParticipantesDTO);

$objDocumentoRN = new DocumentoRN();
$objDocumentoDTO->setStrConteudo(null);
$objDocumentoDTO->getObjProtocoloDTO()->setNumIdUnidadeGeradora(SessaoSEI::getInstance()->getNumIdUnidadeAtual());
$objDocumentoDTO->setStrSinBloqueado('N');
$arrObjParticipantesDTO = InfraArray::distinctArrInfraDTO($objDocumentoDTO->getObjProtocoloDTO()->getArrObjParticipanteDTO(), 'NomeContato');
$arrObjParticipantesDTO = $this->prepararParticipantes($arrObjParticipantesDTO);
$objDocumentoDTO->getObjProtocoloDTO()->setArrObjParticipanteDTO($arrObjParticipantesDTO);

$objDocumentoRN = new DocumentoRN();
$objDocumentoDTO->setStrConteudo(null);
$objDocumentoDTO->getObjProtocoloDTO()->setNumIdUnidadeGeradora(SessaoSEI::getInstance()->getNumIdUnidadeAtual());
$objDocumentoDTO->setStrSinBloqueado('N');

// Atribui componentes digitais já presentes no processo e não reenviados pelo Tramita.gov.br
$this->atribuirComponentesJaExistentesNoProcesso(
$objDocumentoDTO,
$objDocumento->componenteDigital,
$arrDocumentosExistentesPorHash,
$parObjMetadadosProcedimento->arrHashComponenteBaixados
);

//TODO: Fazer a atribuição dos componentes digitais do processo a partir desse ponto
$this->atribuirComponentesDigitais($objDocumentoDTO, $objDocumento->componenteDigital);
$objDocumentoDTOGerado = $objDocumentoRN->cadastrarRN0003($objDocumentoDTO);
$objDocumentoDTOGerado = $objDocumentoRN->cadastrarRN0003($objDocumentoDTO);

$objAtividadeDTOVisualizacao = new AtividadeDTO();
$objAtividadeDTOVisualizacao->setDblIdProtocolo($objDocumentoDTO->getDblIdProcedimento());
$objAtividadeDTOVisualizacao->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual());
$objAtividadeDTOVisualizacao = new AtividadeDTO();
$objAtividadeDTOVisualizacao->setDblIdProtocolo($objDocumentoDTO->getDblIdProcedimento());
$objAtividadeDTOVisualizacao->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual());

if (!$bolReabriuAutomaticamente){
$objAtividadeDTOVisualizacao->setNumTipoVisualizacao(AtividadeRN::$TV_ATENCAO);
}else{
$objAtividadeDTOVisualizacao->setNumTipoVisualizacao(AtividadeRN::$TV_NAO_VISUALIZADO | AtividadeRN::$TV_ATENCAO);
}

$objAtividadeRN = new AtividadeRN();
$objAtividadeRN->atualizarVisualizacaoUnidade($objAtividadeDTOVisualizacao);
$objAtividadeRN = new AtividadeRN();
$objAtividadeRN->atualizarVisualizacaoUnidade($objAtividadeDTOVisualizacao);

$objDocumento->idDocumentoSEI = $objDocumentoDTOGerado->getDblIdDocumento();
$objDocumento->idProcedimentoSEI = $objDocumentoDTO->getDblIdProcedimento();
$objDocumento->protocoloProcedimentoSEI = $objProcedimentoDTO2->getStrProtocoloProcedimentoFormatado();
$objDocumento->idDocumentoSEI = $objDocumentoDTOGerado->getDblIdDocumento();
$objDocumento->idProcedimentoSEI = $objDocumentoDTO->getDblIdProcedimento();
$objDocumento->protocoloProcedimentoSEI = $objProcedimentoDTO2->getStrProtocoloProcedimentoFormatado();

if(!$bolDocumentoAvulso && $objProcessoPrincipal->protocolo != $parObjProtocolo->protocolo){
$objDocumento->protocoloProcedimentoSEI = $parObjProtocolo->protocolo;
Expand Down Expand Up @@ -1751,6 +1770,64 @@ private function atribuirDocumentos($parObjProcedimentoDTO, $parObjProtocolo, $o
}


private function atribuirComponentesJaExistentesNoProcesso($objDocumentoDTO, $objComponentesDigitais, $arrDocumentosExistentesPorHash, $arrHashComponenteBaixados){
$arrObjAnexosDTO = array();
foreach ($objComponentesDigitais as $objComponenteDigital) {
$strHashComponenteDigital = ProcessoEletronicoRN::getHashFromMetaDados($objComponenteDigital->hash);
$bolComponenteDigitalBaixado = in_array($strHashComponenteDigital, $arrHashComponenteBaixados);
$bolComponenteDigitalExistente = array_key_exists($strHashComponenteDigital, $arrDocumentosExistentesPorHash);
if(!$bolComponenteDigitalBaixado && $bolComponenteDigitalExistente){
$arrDocumentoExistente = $arrDocumentosExistentesPorHash[$strHashComponenteDigital];
$arr = $this->clonarComponentesJaExistentesNoProcesso(
$objDocumentoDTO,
$arrDocumentoExistente["IdDocumento"],
$arrDocumentoExistente["ComponenteDigitalDTO"],
$arrDocumentoExistente["MultiplosComponentes"]
);

$arrObjAnexoDTO = array_merge($arrObjAnexosDTO, $arr);
}
}
$objDocumentoDTO->getObjProtocoloDTO()->setArrObjAnexoDTO($arrObjAnexoDTO);
}


private function clonarComponentesJaExistentesNoProcesso($objDocumentoDTO, $dblIdDocumentoReferencia, $objComponenteDigitalDTO, $bolMultiplosComponentes){

$objAnexoDTO = new AnexoDTO();
$objAnexoDTO->retNumIdAnexo();
$objAnexoDTO->retStrNome();
$objAnexoDTO->retNumTamanho();
$objAnexoDTO->retDthInclusao();
$objAnexoDTO->setDblIdProtocolo($dblIdDocumentoReferencia);

$objAnexoRN = new AnexoRN();
$arrObjAnexoDTO = $objAnexoRN->listarRN0218($objAnexoDTO);
if(!empty($arrObjAnexoDTO)){
foreach($arrObjAnexoDTO as $objAnexoDTO){
$strSinDuplicado = 'S';
$strCaminhoAnexo = $objAnexoRN->obterLocalizacao($objAnexoDTO);
if($bolMultiplosComponentes){
$numOrdemComponente = $objComponenteDigitalDTO->getNumOrdem();
list($strCaminhoAnexoTemporario, ) = ProcessoEletronicoRN::descompactarComponenteDigital($strCaminhoAnexo, $numOrdemComponente);
$strCaminhoAnexo = $strCaminhoAnexoTemporario;
$strSinDuplicado = 'N';
}

$strNomeUpload = $objAnexoRN->gerarNomeArquivoTemporario();
$strNomeUploadCompleto = DIR_SEI_TEMP.'/'.$strNomeUpload;
copy($strCaminhoAnexo, $strNomeUploadCompleto);
$objAnexoDTO->setNumIdAnexo($strNomeUpload);
$objAnexoDTO->setDthInclusao(InfraData::getStrDataHoraAtual());
$objAnexoDTO->setStrNome($objComponenteDigitalDTO->getStrNome());
$objAnexoDTO->setStrSinDuplicando($strSinDuplicado);
}
}

return $arrObjAnexoDTO;
}


/**
* Cancela os documentos no processo, verificando se os mesmos j<E1> tinha sido cancelados anteriormente
*
Expand Down Expand Up @@ -1783,7 +1860,6 @@ private function cancelarDocumentosProcesso($parDblIdProcedimento, $parArrIdDocu
}


//TODO: Método deverá poderá ser transferido para a classe responsável por fazer o recebimento dos componentes digitais
private function atribuirComponentesDigitais(DocumentoDTO $parObjDocumentoDTO, $parArrObjComponentesDigitais)
{
if(!isset($parArrObjComponentesDigitais)) {
Expand Down
Loading

0 comments on commit a4e29bd

Please sign in to comment.