Commit ce667e82f4ccc920632a50c63606563d81463f55

Authored by Guilherme Andrade Del Cantoni
1 parent 81d62914

[Fixed #38] Padronização do formato de envio de documento sem link do Número SEI

Showing 1 changed file with 249 additions and 212 deletions   Show diff stats
rn/ExpedirProcedimentoRN.php
... ... @@ -117,150 +117,147 @@ class ExpedirProcedimentoRN extends InfraRN {
117 117 return $this->objProcessoEletronicoRN->consultarMotivosUrgencia();
118 118 }
119 119  
120   - public function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpedirProcedimentoDTO)
121   - {
  120 + public function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpedirProcedimentoDTO)
  121 + {
  122 + $numIdTramite = 0;
  123 + try {
  124 + //Valida Permissão
  125 + SessaoSEI::getInstance()->validarAuditarPermissao('pen_procedimento_expedir',__METHOD__, $objExpedirProcedimentoDTO);
  126 + $dblIdProcedimento = $objExpedirProcedimentoDTO->getDblIdProcedimento();
122 127  
123   - $numIdTramite = 0;
  128 + $this->barraProgresso->exibir();
  129 + //Valida regras de negócio
  130 + $this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_VALIDACAO);
  131 + $this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_VALIDACAO);
124 132  
125   - try {
126   - //Valida Permissão
127   - SessaoSEI::getInstance()->validarAuditarPermissao('pen_procedimento_expedir',__METHOD__, $objExpedirProcedimentoDTO);
128   - $dblIdProcedimento = $objExpedirProcedimentoDTO->getDblIdProcedimento();
  133 + $objInfraException = new InfraException();
  134 + //Carregamento dos dados de processo e documento para validação e envio externo
  135 + $objProcedimentoDTO = $this->consultarProcedimento($dblIdProcedimento);
  136 + $objProcedimentoDTO->setArrObjDocumentoDTO($this->listarDocumentos($dblIdProcedimento));
  137 + $objProcedimentoDTO->setArrObjParticipanteDTO($this->listarInteressados($dblIdProcedimento));
  138 + $this->validarPreCondicoesExpedirProcedimento($objInfraException, $objProcedimentoDTO);
  139 + $this->validarParametrosExpedicao($objInfraException, $objExpedirProcedimentoDTO);
129 140  
130   - $this->barraProgresso->exibir();
131   - //Valida regras de negócio
132   - $this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_VALIDACAO);
133   - $this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_VALIDACAO);
134   -
135   - $objInfraException = new InfraException();
136   - //Carregamento dos dados de processo e documento para validação e envio externo
137   - $objProcedimentoDTO = $this->consultarProcedimento($dblIdProcedimento);
138   - $objProcedimentoDTO->setArrObjDocumentoDTO($this->listarDocumentos($dblIdProcedimento));
139   - $objProcedimentoDTO->setArrObjParticipanteDTO($this->listarInteressados($dblIdProcedimento));
140   - $this->validarPreCondicoesExpedirProcedimento($objInfraException, $objProcedimentoDTO);
141   - $this->validarParametrosExpedicao($objInfraException, $objExpedirProcedimentoDTO);
142 141 //Apresentao da mensagens de validao na janela da barra de progresso
143   - if($objInfraException->contemValidacoes()){
144   - $this->barraProgresso->mover(0);
145   - $this->barraProgresso->setStrRotulo('Erro durante validação dos dados do processo.');
146   - $objInfraException->lancarValidacoes();
147   - }
  142 + if($objInfraException->contemValidacoes()){
  143 + $this->barraProgresso->mover(0);
  144 + $this->barraProgresso->setStrRotulo('Erro durante validação dos dados do processo.');
  145 + $objInfraException->lancarValidacoes();
  146 + }
148 147  
149   - $this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_PROCEDIMENTO);
150   - $this->barraProgresso->setStrRotulo(sprintf(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_PROCEDIMENTO, $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()));
151   - //Construo dos cabecalho para envio do processo
152   - $objCabecalho = $this->construirCabecalho($objExpedirProcedimentoDTO);
  148 + $this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_PROCEDIMENTO);
  149 + $this->barraProgresso->setStrRotulo(sprintf(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_PROCEDIMENTO, $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()));
153 150  
154   - //Construo do processo para envio
155   - $objProcesso = $this->construirProcesso($dblIdProcedimento, $objExpedirProcedimentoDTO->getArrIdProcessoApensado());
  151 + //Construo dos cabecalho para envio do processo
  152 + $objCabecalho = $this->construirCabecalho($objExpedirProcedimentoDTO);
156 153  
157   - try {
  154 + //Construo do processo para envio
  155 + $objProcesso = $this->construirProcesso($dblIdProcedimento, $objExpedirProcedimentoDTO->getArrIdProcessoApensado());
158 156  
  157 + try {
  158 + $param = new stdClass();
  159 + $param->novoTramiteDeProcesso = new stdClass();
  160 + $param->novoTramiteDeProcesso->cabecalho = $objCabecalho;
  161 + $param->novoTramiteDeProcesso->processo = $objProcesso;
  162 + $novoTramite = $this->objProcessoEletronicoRN->enviarProcesso($param);
  163 + $numIdTramite = $novoTramite->dadosTramiteDeProcessoCriado->IDT;
159 164  
160   - $param = new stdClass();
161   - $param->novoTramiteDeProcesso = new stdClass();
162   - $param->novoTramiteDeProcesso->cabecalho = $objCabecalho;
163   - $param->novoTramiteDeProcesso->processo = $objProcesso;
164   - $novoTramite = $this->objProcessoEletronicoRN->enviarProcesso($param);
165   - $numIdTramite = $novoTramite->dadosTramiteDeProcessoCriado->IDT;
  165 + } catch (\Exception $e) {
  166 + throw new InfraException("Error Processing Request", $e);
  167 + }
166 168  
167   - } catch (\Exception $e) {
168   - throw new InfraException("Error Processing Request", $e);
169   - }
  169 + $this->atualizarPenProtocolo($dblIdProcedimento);
170 170  
171   - $this->atualizarPenProtocolo($dblIdProcedimento);
172   - if (isset($novoTramite->dadosTramiteDeProcessoCriado)) {
173   - $objTramite = $novoTramite->dadosTramiteDeProcessoCriado;
174   - $this->objProcedimentoAndamentoRN->setOpts($objTramite->NRE, $objTramite->IDT, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_EXPEDIDO), $dblIdProcedimento);
175   - try {
  171 + if (isset($novoTramite->dadosTramiteDeProcessoCriado)) {
  172 + $objTramite = $novoTramite->dadosTramiteDeProcessoCriado;
  173 + $this->objProcedimentoAndamentoRN->setOpts($objTramite->NRE, $objTramite->IDT, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_EXPEDIDO), $dblIdProcedimento);
176 174  
177   - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Envio do metadados do processo', 'S'));
178   - $idAtividadeExpedicao = $this->bloquearProcedimentoExpedicao($objExpedirProcedimentoDTO, $objProcesso->idProcedimentoSEI);
  175 + try {
  176 + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Envio do metadados do processo', 'S'));
  177 + $idAtividadeExpedicao = $this->bloquearProcedimentoExpedicao($objExpedirProcedimentoDTO, $objProcesso->idProcedimentoSEI);
179 178  
  179 + $this->objProcessoEletronicoRN->cadastrarTramiteDeProcesso(
  180 + $objProcesso->idProcedimentoSEI,
  181 + $objTramite->NRE,
  182 + $objTramite->IDT,
  183 + ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO,
  184 + $objTramite->dataHoraDeRegistroDoTramite,
  185 + $objExpedirProcedimentoDTO->getNumIdRepositorioOrigem(),
  186 + $objExpedirProcedimentoDTO->getNumIdUnidadeOrigem(),
  187 + $objExpedirProcedimentoDTO->getNumIdRepositorioDestino(),
  188 + $objExpedirProcedimentoDTO->getNumIdUnidadeDestino(),
  189 + $objProcesso,
  190 + $objTramite->ticketParaEnvioDeComponentesDigitais,
  191 + $objTramite->componentesDigitaisSolicitados);
180 192  
181   - $this->objProcessoEletronicoRN->cadastrarTramiteDeProcesso(
182   - $objProcesso->idProcedimentoSEI,
183   - $objTramite->NRE,
184   - $objTramite->IDT,
185   - ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO,
186   - $objTramite->dataHoraDeRegistroDoTramite,
187   - $objExpedirProcedimentoDTO->getNumIdRepositorioOrigem(),
188   - $objExpedirProcedimentoDTO->getNumIdUnidadeOrigem(),
189   - $objExpedirProcedimentoDTO->getNumIdRepositorioDestino(),
190   - $objExpedirProcedimentoDTO->getNumIdUnidadeDestino(),
191   - $objProcesso,
192   - $objTramite->ticketParaEnvioDeComponentesDigitais,
193   - $objTramite->componentesDigitaisSolicitados);
194 193  
  194 + $this->objProcessoEletronicoRN->cadastrarTramitePendente($objTramite->IDT, $idAtividadeExpedicao);
  195 + //error_log('TRAMITE: ' . print_r($objTramite, true));
  196 + //error_log('before enviarComponentesDigitais');
195 197  
196   - $this->objProcessoEletronicoRN->cadastrarTramitePendente($objTramite->IDT, $idAtividadeExpedicao);
197   - //error_log('TRAMITE: ' . print_r($objTramite, true));
198   - //error_log('before enviarComponentesDigitais');
  198 + //TODO: Erro no BARRAMENTO: Processo no pode ser enviado se possuir 2 documentos iguais(mesmo hash)
  199 + //TODO: Melhoria no barramento de servios. O mtodo solicitar metadados no deixa claro quais os componentes digitais que
  200 + //precisam ser baixados. No cenrio de retorno de um processo existente, a nica forma consultar o status do trâmite para
  201 + //saber quais precisam ser baixados. O processo poderia ser mais otimizado se o retorno nos metadados j informasse quais os
  202 + //componentes precisam ser baixados, semelhante ao que ocorre no enviarProcesso onde o barramento informa quais os componentes
  203 + //que precisam ser enviados
199 204  
200   - //TODO: Erro no BARRAMENTO: Processo no pode ser enviado se possuir 2 documentos iguais(mesmo hash)
201   - //TODO: Melhoria no barramento de servios. O mtodo solicitar metadados no deixa claro quais os componentes digitais que
202   - //precisam ser baixados. No cenrio de retorno de um processo existente, a nica forma consultar o status do trâmite para
203   - //saber quais precisam ser baixados. O processo poderia ser mais otimizado se o retorno nos metadados j informasse quais os
204   - //componentes precisam ser baixados, semelhante ao que ocorre no enviarProcesso onde o barramento informa quais os componentes
205   - //que precisam ser enviados
  205 + $this->enviarComponentesDigitais($objTramite->NRE, $objTramite->IDT, $objProcesso->protocolo);
  206 + //error_log('after enviarComponentesDigitais');
  207 + //$strNumeroRegistro, $numIdTramite, $strProtocolo
  208 + //error_log('==========================>>>>' . print_r($objTramite, true));
206 209  
207   - $this->enviarComponentesDigitais($objTramite->NRE, $objTramite->IDT, $objProcesso->protocolo);
208   - //error_log('after enviarComponentesDigitais');
209   - //$strNumeroRegistro, $numIdTramite, $strProtocolo
210   - //error_log('==========================>>>>' . print_r($objTramite, true));
  210 + //TODO: Ao enviar o processo e seus documentos, necessrio bloquear os documentos para alterao
  211 + //pois eles j foram visualizados
  212 + //$objDocumentoRN = new DocumentoRN();
  213 + //$objDocumentoRN->bloquearConsultado($objDocumentoRN->consultarRN0005($objDocumentoDTO));
211 214  
212   - //TODO: Ao enviar o processo e seus documentos, necessrio bloquear os documentos para alterao
213   - //pois eles j foram visualizados
214   - //$objDocumentoRN = new DocumentoRN();
215   - //$objDocumentoRN->bloquearConsultado($objDocumentoRN->consultarRN0005($objDocumentoDTO));
216 215  
  216 + //TODO: Implementar o registro de auditoria, armazenando os metadados xml enviados para o PEN
217 217  
218   - //TODO: Implementar o registro de auditoria, armazenando os metadados xml enviados para o PEN
219 218  
220   - //return ;
  219 + # $this->enviarDocProdimentoTramite();
  220 + // $this->gravarAuditoria(__METHOD__ , $objExpedirProcedimentoDTO->getDblIdProcedimento());
  221 + //$this->bloquearProcesso($objExpedirProcedimentoDTO->getDblIdProcedimento());
  222 + #$this->enviarDocProdimentoTramite();
  223 + //return array('mensagem' => 'Processo em expedio!', 'retorno' => 1);
221 224  
222   - # $this->enviarDocProdimentoTramite();
223   - // $this->gravarAuditoria(__METHOD__ , $objExpedirProcedimentoDTO->getDblIdProcedimento());
224   - //$this->bloquearProcesso($objExpedirProcedimentoDTO->getDblIdProcedimento());
225   - #$this->enviarDocProdimentoTramite();
226   - //return array('mensagem' => 'Processo em expedio!', 'retorno' => 1);
  225 + //TODO: Alterar atualizao para somente apresentar ao final de todo o trâmite
  226 + $this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_CONCLUSAO);
  227 + $this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_CONCLUSAO);
227 228  
228   - //TODO: Alterar atualizao para somente apresentar ao final de todo o trâmite
229   - $this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_CONCLUSAO);
230   - $this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_CONCLUSAO);
  229 + // @join_tec US008.06 (#23092)
  230 + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'S'));
231 231  
232   - // @join_tec US008.06 (#23092)
233   - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'S'));
  232 + $this->receberReciboDeEnvio($objTramite->IDT);
  233 + }
  234 + catch (\Exception $e) {
  235 + //@TODO: Melhorar essa estrutura
  236 + //Realiza o desbloqueio do processo
  237 + try{ $this->desbloquearProcessoExpedicao($objProcesso->idProcedimentoSEI); } catch (InfraException $ex) { }
  238 +
  239 + //@TODO: Melhorar essa estrutura
  240 + //Realiza o cancelamento do tramite
  241 + try{
  242 + if($numIdTramite != 0){
  243 + $this->objProcessoEletronicoRN->cancelarTramite($numIdTramite);
  244 + }
  245 + } catch (InfraException $ex) { }
  246 +
  247 + $this->registrarAndamentoExpedicaoAbortada($objProcesso->idProcedimentoSEI);
  248 +
  249 + // @join_tec US008.06 (#23092)
  250 + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'N'));
  251 + throw $e;
  252 + }
  253 + }
234 254  
235   - $this->receberReciboDeEnvio($objTramite->IDT);
  255 + } catch (\Exception $e) {
  256 + throw new InfraException('Falha de comunicação com o serviços de integração. Por favor, tente novamente mais tarde.', $e);
236 257 }
237   - catch (\Exception $e) {
238   - //@TODO: Melhorar essa estrutura
239   - //Realiza o desbloqueio do processo
240   - try{
241   - $this->desbloquearProcessoExpedicao($objProcesso->idProcedimentoSEI);
242   - } catch (InfraException $ex) { }
243   -
244   - //@TODO: Melhorar essa estrutura
245   - //Realiza o cancelamento do tramite
246   - try{
247   - if($numIdTramite != 0){
248   - $this->objProcessoEletronicoRN->cancelarTramite($numIdTramite);
249   - }
250   - } catch (InfraException $ex) { }
  258 + }
251 259  
252   - $this->registrarAndamentoExpedicaoAbortada($objProcesso->idProcedimentoSEI);
253 260  
254   - // @join_tec US008.06 (#23092)
255   - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'N'));
256   - throw $e;
257   - }
258   - }
259   -
260   - } catch (\Exception $e) {
261   - throw new InfraException('Falha de comunicação com o serviços de integração. Por favor, tente novamente mais tarde.', $e);
262   - }
263   - }
264 261  
265 262 private function registrarAndamentoExpedicaoProcesso($objExpedirProcedimentoDTO, $objProcesso)
266 263 {
... ... @@ -322,90 +319,85 @@ class ExpedirProcedimentoRN extends InfraRN {
322 319 $this->registrarAndamentoExpedicaoProcesso($objExpedirProcedimentoDTO, $objProcessoApensado);
323 320 }
324 321 }
325   -
326   -
327 322 }
328 323  
329   - private function construirCabecalho(ExpedirProcedimentoDTO $objExpedirProcedimentoDTO)
330   - {
331   - if(!isset($objExpedirProcedimentoDTO)){
332   - throw new InfraException('Parâmetro $objExpedirProcedimentoDTO não informado.');
333   - }
  324 + private function construirCabecalho(ExpedirProcedimentoDTO $objExpedirProcedimentoDTO)
  325 + {
  326 + if(!isset($objExpedirProcedimentoDTO)){
  327 + throw new InfraException('Parâmetro $objExpedirProcedimentoDTO não informado.');
  328 + }
334 329  
335   - //Obtenção do nmero de registro eletrônico do processo
336   - $strNumeroRegistro = null;
337   - $objProcessoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco());
338   - $objProcessoEletronicoDTO = new ProcessoEletronicoDTO();
339   - $objProcessoEletronicoDTO->setDblIdProcedimento($objExpedirProcedimentoDTO->getDblIdProcedimento());
  330 + //Obtenção do número de registro eletrônico do processo
  331 + $strNumeroRegistro = null;
  332 + $objProcessoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco());
  333 + $objProcessoEletronicoDTO = new ProcessoEletronicoDTO();
  334 + $objProcessoEletronicoDTO->setDblIdProcedimento($objExpedirProcedimentoDTO->getDblIdProcedimento());
340 335 //TODO: Tratar situao de quando localizado dois registros para o mesmo processo
341   - $objProcessoEletronicoDTO->setNumMaxRegistrosRetorno(1);
342   - $objProcessoEletronicoDTO->setOrd('IdProcedimento', InfraDTO::$TIPO_ORDENACAO_DESC);
343   - $objProcessoEletronicoDTO->retStrNumeroRegistro();
344   -
345   - $objProcessoEletronicoDTO = $objProcessoEletronicoBD->consultar($objProcessoEletronicoDTO);
346   - if(isset($objProcessoEletronicoDTO)) {
347   - $strNumeroRegistro = $objProcessoEletronicoDTO->getStrNumeroRegistro();
348   - }
349   -
350   - // Consultar se processo eletrônico existe no PEN algum trâmite CANCELADO, caso
351   - // sim deve ser gerada uma nova NRE, pois a atual ser recusada pelo PEN quando
352   - // for enviado
353   - /* if(!InfraString::isBolVazia($strNumeroRegistro)) {
354   - $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites(null, $strNumeroRegistro);
355   - if(!empty($arrObjTramite) && is_array($arrObjTramite) && count($arrObjTramite) === 1) {
356   - $objTramite = current($arrObjTramite);
357   - if($objTramite->situacaoAtual == ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO || $objTramite->situacaoAtual == ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO){
358   - $strNumeroRegistro = null;
359   - }
  336 + $objProcessoEletronicoDTO->setNumMaxRegistrosRetorno(1);
  337 + $objProcessoEletronicoDTO->setOrd('IdProcedimento', InfraDTO::$TIPO_ORDENACAO_DESC);
  338 + $objProcessoEletronicoDTO->retStrNumeroRegistro();
  339 +
  340 + $objProcessoEletronicoDTO = $objProcessoEletronicoBD->consultar($objProcessoEletronicoDTO);
  341 + if(isset($objProcessoEletronicoDTO)) {
  342 + $strNumeroRegistro = $objProcessoEletronicoDTO->getStrNumeroRegistro();
360 343 }
361   - } */
362 344  
  345 + // Consultar se processo eletrônico existe no PEN algum trâmite CANCELADO, caso
  346 + // sim deve ser gerada uma nova NRE, pois a atual ser recusada pelo PEN quando
  347 + // for enviado
  348 + /* if(!InfraString::isBolVazia($strNumeroRegistro)) {
  349 + $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites(null, $strNumeroRegistro);
  350 + if(!empty($arrObjTramite) && is_array($arrObjTramite) && count($arrObjTramite) === 1) {
  351 + $objTramite = current($arrObjTramite);
  352 + if($objTramite->situacaoAtual == ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO || $objTramite->situacaoAtual == ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO){
  353 + $strNumeroRegistro = null;
  354 + }
  355 + }
  356 + } */
  357 +
  358 + return $this->objProcessoEletronicoRN->construirCabecalho(
  359 + $strNumeroRegistro,
  360 + $objExpedirProcedimentoDTO->getNumIdRepositorioOrigem(),
  361 + $objExpedirProcedimentoDTO->getNumIdUnidadeOrigem(),
  362 + $objExpedirProcedimentoDTO->getNumIdRepositorioDestino(),
  363 + $objExpedirProcedimentoDTO->getNumIdUnidadeDestino(),
  364 + $objExpedirProcedimentoDTO->getBolSinUrgente(),
  365 + $objExpedirProcedimentoDTO->getNumIdMotivoUrgencia(),
  366 + false /*obrigarEnvioDeTodosOsComponentesDigitais*/
  367 + );
  368 + }
363 369  
364   - return $this->objProcessoEletronicoRN->construirCabecalho(
365   - //TODO: Desabilitado consulta do NRE para questes de teste
366   - $strNumeroRegistro,
367   - $objExpedirProcedimentoDTO->getNumIdRepositorioOrigem(),
368   - $objExpedirProcedimentoDTO->getNumIdUnidadeOrigem(),
369   - $objExpedirProcedimentoDTO->getNumIdRepositorioDestino(),
370   - $objExpedirProcedimentoDTO->getNumIdUnidadeDestino(),
371   - $objExpedirProcedimentoDTO->getBolSinUrgente(),
372   - $objExpedirProcedimentoDTO->getNumIdMotivoUrgencia(),
373   - false /*obrigarEnvioDeTodosOsComponentesDigitais*/);
  370 + private function construirProcesso($dblIdProcedimento, $arrIdProcessoApensado = null)
  371 + {
  372 + if(!isset($dblIdProcedimento)){
  373 + throw new InfraException('Parâmetro $dblIdProcedimento não informado.');
  374 + }
374 375  
375   - }
  376 + //TODO: Passar dados do ProcedimentoDTO via parâmetro j carregado anteriormente
  377 + $objProcedimentoDTO = $this->consultarProcedimento($dblIdProcedimento);
  378 + $objPenRelHipoteseLegalRN = new PenRelHipoteseLegalEnvioRN();
  379 +
  380 + $objProcesso = new stdClass();
  381 + $objProcesso->protocolo = utf8_encode($objProcedimentoDTO->getStrProtocoloProcedimentoFormatado());
  382 + $objProcesso->nivelDeSigilo = $this->obterNivelSigiloPEN($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo());
  383 + $objProcesso->processoDeNegocio = utf8_encode($objProcedimentoDTO->getStrNomeTipoProcedimento());
  384 + $objProcesso->descricao = utf8_encode($objProcedimentoDTO->getStrDescricaoProtocolo());
  385 + $objProcesso->dataHoraDeProducao = $this->objProcessoEletronicoRN->converterDataWebService($objProcedimentoDTO->getDtaGeracaoProtocolo());
  386 + if($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO){
  387 + $objProcesso->hipoteseLegal = new stdClass();
  388 + $objProcesso->hipoteseLegal->identificacao = $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($objProcedimentoDTO->getNumIdHipoteseLegalProtocolo());
  389 + }
376 390  
377   - private function construirProcesso($dblIdProcedimento, $arrIdProcessoApensado = null)
378   - {
  391 + $this->atribuirProdutorProcesso($objProcesso, $objProcedimentoDTO->getNumIdUsuarioGeradorProtocolo(), $objProcedimentoDTO->getNumIdUnidadeGeradoraProtocolo());
  392 + $this->atribuirDataHoraDeRegistro($objProcesso, $objProcedimentoDTO->getDblIdProcedimento());
  393 + $this->atribuirDocumentos($objProcesso, $dblIdProcedimento);
  394 + $this->atribuirDadosInteressados($objProcesso, $dblIdProcedimento);
  395 + $this->adicionarProcessosApensados($objProcesso, $arrIdProcessoApensado);
379 396  
380   - if(!isset($dblIdProcedimento)){
381   - throw new InfraException('Parâmetro $dblIdProcedimento não informado.');
  397 + $objProcesso->idProcedimentoSEI = $dblIdProcedimento;
  398 + return $objProcesso;
382 399 }
383 400  
384   - //TODO: Passar dados do ProcedimentoDTO via parâmetro j carregado anteriormente
385   - $objProcedimentoDTO = $this->consultarProcedimento($dblIdProcedimento);
386   - $objPenRelHipoteseLegalRN = new PenRelHipoteseLegalEnvioRN();
387   - $objProcesso = new stdClass();
388   - $objProcesso->protocolo = utf8_encode($objProcedimentoDTO->getStrProtocoloProcedimentoFormatado());
389   - $objProcesso->nivelDeSigilo = $this->obterNivelSigiloPEN($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo());
390   - $objProcesso->processoDeNegocio = utf8_encode($objProcedimentoDTO->getStrNomeTipoProcedimento());
391   - $objProcesso->descricao = utf8_encode($objProcedimentoDTO->getStrDescricaoProtocolo());
392   - $objProcesso->dataHoraDeProducao = $this->objProcessoEletronicoRN->converterDataWebService($objProcedimentoDTO->getDtaGeracaoProtocolo());
393   - if($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO){
394   - $objProcesso->hipoteseLegal = new stdClass();
395   - $objProcesso->hipoteseLegal->identificacao = $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($objProcedimentoDTO->getNumIdHipoteseLegalProtocolo());
396   - }
397   - $this->atribuirProdutorProcesso($objProcesso,
398   - $objProcedimentoDTO->getNumIdUsuarioGeradorProtocolo(),
399   - $objProcedimentoDTO->getNumIdUnidadeGeradoraProtocolo());
400   - $this->atribuirDataHoraDeRegistro($objProcesso, $objProcedimentoDTO->getDblIdProcedimento());
401   -
402   - $this->atribuirDocumentos($objProcesso, $dblIdProcedimento);
403   - $this->atribuirDadosInteressados($objProcesso, $dblIdProcedimento);
404   - $this->adicionarProcessosApensados($objProcesso, $arrIdProcessoApensado);
405   - $objProcesso->idProcedimentoSEI = $dblIdProcedimento;
406   - return $objProcesso;
407   - }
408   -
409 401 //TODO: Implementar mapeamento de atividades que sero enviadas para barramento (semelhante Protocolo Integrado)
410 402 private function atribuirDadosHistorico($objProcesso, $dblIdProcedimento)
411 403 {
... ... @@ -828,6 +820,7 @@ class ExpedirProcedimentoRN extends InfraRN {
828 820 if($documentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO){
829 821 $documento->hipoteseLegal = new stdClass();
830 822 $documento->hipoteseLegal->identificacao = $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($documentoDTO->getNumIdHipoteseLegalProtocolo());
  823 + //TODO: Adicionar nome da hipótese legal atribuida ao documento
831 824 }
832 825 $documento->dataHoraDeProducao = $this->objProcessoEletronicoRN->converterDataWebService($documentoDTO->getDtaGeracaoProtocolo());
833 826 $documento->produtor = new stdClass();
... ... @@ -846,7 +839,7 @@ class ExpedirProcedimentoRN extends InfraRN {
846 839 $documento->produtor->unidade->tipo = self::STA_TIPO_PESSOA_ORGAOPUBLICO;
847 840 //TODO: Informar dados da estrutura organizacional (estruturaOrganizacional)
848 841 }
849   - $documento->produtor->numeroDeIdentificacao = $documentoDTO->getStrProtocoloDocumentoFormatado();
  842 + $documento->produtor->numeroDeIdentificacao = $documentoDTO->getStrProtocoloDocumentoFormatado(); //TODO: Avaliar se informação está correta
850 843  
851 844 $this->atribuirDataHoraDeRegistro($documento, $documentoDTO->getDblIdProcedimento(), $documentoDTO->getDblIdDocumento());
852 845 //TODO: Implementar mapeamento de espécies documentais
... ... @@ -958,8 +951,6 @@ class ExpedirProcedimentoRN extends InfraRN {
958 951  
959 952 private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDocumentoDTO)
960 953 {
961   -
962   -
963 954 if(!isset($objDocumento)){
964 955 throw new InfraException('Parâmetro $objDocumento não informado.');
965 956 }
... ... @@ -973,11 +964,22 @@ class ExpedirProcedimentoRN extends InfraRN {
973 964 if(!isset($arrInformacaoArquivo) || count($arrInformacaoArquivo) == 0){
974 965 throw new InfraException('Erro durante obtenção de informações sobre o componente digital do documento {$objDocumentoDTO->getStrProtocoloDocumentoFormatado()}.');
975 966 }
976   - //TODO: Revisar tal implementao para atender a gerao de hash de arquivos grandes
  967 +
977 968 $strAlgoritmoHash = self::ALGORITMO_HASH_DOCUMENTO;
978 969 $strConteudoAssinatura = $arrInformacaoArquivo['CONTEUDO'];
979 970 $hashDoComponenteDigital = hash($strAlgoritmoHash, $strConteudoAssinatura, true);
980 971 $hashDoComponenteDigital = base64_encode($hashDoComponenteDigital);
  972 +
  973 + //Busca registro de tramitações anteriores para este componente digital para identificar se o Barramento do PEN já havia registrado o hash do documento gerado da
  974 + //forma antiga, ou seja, considerando o link do Número SEI. Este link foi removido para manter o padrão de conteúdo de documentos utilizado pelo SEI para assinatura
  975 + //Para não bloquear os documentos gerados anteriormente, aqueles já registrados pelo Barramento com o hash antigo deverão manter a geração de conteúdo anteriormente utilizada.
  976 + $objComponenteDigital = $this->consultarComponenteDigital($objDocumentoDTO->getDblIdDocumento());
  977 + $hashDoComponenteDigitalAnterior = (isset($objComponenteDigital)) ? $objComponenteDigital->getStrHashConteudo() : null;
  978 + if(isset($hashDoComponenteDigitalAnterior) && ($hashDoComponenteDigitalAnterior <> $hashDoComponenteDigital)){
  979 + $hashDoComponenteDigital = $arrInformacaoArquivo['CONTEUDO_LEGADO'];
  980 + }
  981 +
  982 + //TODO: Revisar tal implementao para atender a gerao de hash de arquivos grandes
981 983 $objDocumento->componenteDigital = new stdClass();
982 984 $objDocumento->componenteDigital->ordem = 1;
983 985 $objDocumento->componenteDigital->nome = utf8_encode($arrInformacaoArquivo["NOME"]);
... ... @@ -1081,10 +1083,22 @@ class ExpedirProcedimentoRN extends InfraRN {
1081 1083 $objDocumento->componenteDigital->assinaturaDigital[] = $objAssinaturaDigital;
1082 1084 }
1083 1085  
1084   -
1085 1086 return $objDocumento;
1086 1087 }
1087 1088  
  1089 +
  1090 + private function consultarComponenteDigital($parDblIdDocumento)
  1091 + {
  1092 + $objComponenteDigitalDTO = new ComponenteDigitalDTO();
  1093 + $objComponenteDigitalDTO->setDblIdDocumento($parDblIdDocumento);
  1094 + $objComponenteDigitalDTO->setNumMaxRegistrosRetorno(1);
  1095 + $objComponenteDigitalDTO->setOrd('IdTramite', InfraDTO::$TIPO_ORDENACAO_DESC);
  1096 + $objComponenteDigitalDTO->retTodos();
  1097 +
  1098 + $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco());
  1099 + return $objComponenteDigitalBD->consultar($objComponenteDigitalDTO);
  1100 + }
  1101 +
1088 1102 private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO)
1089 1103 {
1090 1104  
... ... @@ -1100,27 +1114,12 @@ class ExpedirProcedimentoRN extends InfraRN {
1100 1114 $docEmailEnviado = $objDocumentoDTO->getNumIdSerie() == $idSerieEmail && $objDocumentoDTO->getStrStaDocumento() == DocumentoRN::$TD_FORMULARIO_AUTOMATICO ? true : false;
1101 1115  
1102 1116 if($objDocumentoDTO->getStrStaDocumento() == DocumentoRN::$TD_EDITOR_INTERNO) {
  1117 + $strConteudoAssinatura = $this->obterConteudoInternoAssinatura($objDocumentoDTO->getDblIdDocumento());
  1118 + $strConteudoAssinaturaLegado = $this->obterConteudoInternoAssinatura($objDocumentoDTO->getDblIdDocumento(), true);
1103 1119  
1104   - $objEditorDTO = new EditorDTO();
1105   - $objEditorDTO->setDblIdDocumento($objDocumentoDTO->getDblIdDocumento());
1106   - $objEditorDTO->setNumIdBaseConhecimento(null);
1107   - $objEditorDTO->setStrSinCabecalho('S');
1108   - $objEditorDTO->setStrSinRodape('S');
1109   - $objEditorDTO->setStrSinIdentificacaoVersao('S');
1110   - $objEditorDTO->setStrSinProcessarLinks('S');
1111   -
1112   - $numVersaoAtual = intval(str_replace('.', '', SEI_VERSAO));
1113   - $numVersaoCarimboObrigatorio = intval(str_replace('.', '', self::VERSAO_CARIMBO_PUBLICACAO_OBRIGATORIO));
1114   - if ($numVersaoAtual >= $numVersaoCarimboObrigatorio) {
1115   - $objEditorDTO->setStrSinCarimboPublicacao('N');
1116   - }
1117   -
1118   - $objEditorRN = new EditorRN();
1119   - $strConteudoAssinatura = $objEditorRN->consultarHtmlVersao($objEditorDTO);
1120   -
1121   - //$strConteudoAssinatura = $objDocumentoDTO->getStrConteudoAssinatura();
1122 1120 $arrInformacaoArquivo['NOME'] = $strProtocoloDocumentoFormatado . ".html";
1123 1121 $arrInformacaoArquivo['CONTEUDO'] = $strConteudoAssinatura;
  1122 + $arrInformacaoArquivo['CONTEUDO_LEGADO'] = $strConteudoAssinaturaLegado;
1124 1123 $arrInformacaoArquivo['TAMANHO'] = strlen($strConteudoAssinatura);
1125 1124 $arrInformacaoArquivo['MIME_TYPE'] = 'text/html';
1126 1125 $arrInformacaoArquivo['ID_ANEXO'] = null;
... ... @@ -1199,6 +1198,46 @@ class ExpedirProcedimentoRN extends InfraRN {
1199 1198 return $arrInformacaoArquivo;
1200 1199 }
1201 1200  
  1201 +
  1202 + /**
  1203 + * Método de obtenção do conteúdo do documento interno para envio e cálculo de hash
  1204 + *
  1205 + * Anteriormente, os documentos enviados para o Barramento de Serviços do PEN continham o link para o número SEI do documento.
  1206 + * Este link passou a não ser mais considerado pois é uma informação dinâmica e pertinente apenas quando o documento é visualizado
  1207 + * dentro do sistema SEI. Quando o documento é tramitado externamente, este link não possui mais sentido.
  1208 + *
  1209 + * Para tratar esta transição entre os formatos de documentos, existe o parâmetro $bolFormatoLegado para indicar qual formato deverá
  1210 + * ser utilizado na montagem dos metadados para envio. *
  1211 + *
  1212 + * @param Double $parDblIdDocumento Identificador do documento
  1213 + * @param boolean $bolFormatoLegado Flag indicando se a forma antiga de recuperação de conteúdo para envio deverá ser utilizada
  1214 + * @return String Conteúdo completo do documento para envio
  1215 + */
  1216 + private function obterConteudoInternoAssinatura($parDblIdDocumento, $bolFormatoLegado=false)
  1217 + {
  1218 + $objEditorDTO = new EditorDTO();
  1219 + $objEditorDTO->setDblIdDocumento($parDblIdDocumento);
  1220 + $objEditorDTO->setNumIdBaseConhecimento(null);
  1221 + $objEditorDTO->setStrSinCabecalho('S');
  1222 + $objEditorDTO->setStrSinRodape('S');
  1223 + $objEditorDTO->setStrSinIdentificacaoVersao('N');
  1224 +
  1225 + if($bolFormatoLegado) {
  1226 + $objEditorDTO->setStrSinIdentificacaoVersao('S');
  1227 + $objEditorDTO->setStrSinProcessarLinks('S');
  1228 + }
  1229 +
  1230 + $numVersaoAtual = intval(str_replace('.', '', SEI_VERSAO));
  1231 + $numVersaoCarimboObrigatorio = intval(str_replace('.', '', self::VERSAO_CARIMBO_PUBLICACAO_OBRIGATORIO));
  1232 + if ($numVersaoAtual >= $numVersaoCarimboObrigatorio) {
  1233 + $objEditorDTO->setStrSinCarimboPublicacao('N');
  1234 + }
  1235 +
  1236 + $objEditorRN = new EditorRN();
  1237 + return $objEditorRN->consultarHtmlVersao($objEditorDTO);
  1238 + }
  1239 +
  1240 +
1202 1241 private function obterTipoDeConteudo($strMimeType)
1203 1242 {
1204 1243 if(!isset($strMimeType)){
... ... @@ -1532,8 +1571,6 @@ class ExpedirProcedimentoRN extends InfraRN {
1532 1571 $arrInformacaoArquivo = $this->obterDadosArquivo($objDocumentoDTO);
1533 1572 $dadosDoComponenteDigital->conteudoDoComponenteDigital = new SoapVar($arrInformacaoArquivo['CONTEUDO'], XSD_BASE64BINARY);
1534 1573  
1535   -
1536   -
1537 1574 try {
1538 1575 //Enviar componentes digitais
1539 1576 $parametros = new stdClass();
... ...