Comportamento Verificador Periódico
EM CONSTRUÇÃO
Nesta seção descreveremos as tarefas realizadas pela rotina "Verificador Periódido". As informções aqui descritas foram obtidas da implementação do componente de software "VerificadorPeriodico.java".
O que é o Verificador Periódico?
O Verificador Periódico é uma rotina (job) da aplicação PJe que é executada automaticamente com periodicidade diária em hora previamente programada (normalmente, meia noite). Essa rotina é responsável pela realização de diversas tarefas executadas na seguinte ordem:
- Obtém o identificador do usuário do sistema conforme cadastrado no parâmetro "idUsuarioSistema".
- Recupera os feriados que afetam o órgão julgador dado, ou seja, àqueles que pertencem ao próprio órgão, ao seu município sede (municipais), à unidade federativa em que está o município (estaduais ou distritais) e a todo o país (nacionais).
- ***** O que faz o Verificador Periódico? ***** O Verificador Periódico é um job da aplicação PJe que é executado diariamente em determinada hora previamente programada (normalmente, meia noite).
Essa funcionalidade realiza as seguintes tarefas, nessa ordem:
1- Obtém o id do usuário do sistema conforme cadastrado no parâmetro "idUsuarioSistema".
2- Recupera os feriados que afetam o órgão julgador dado, ou seja, aqueles que pertencem ao próprio órgão, ao seu
município sede (municipais), à unidade federativa em que está o município (estaduais ou distritais) e a todo o país (nacionais).
3- método "registrarCienciaAutomatica" - prazos de graça expirados e registrando a ciência automatizada
3.1 - Seleção de expedientes:
- Obtém os prazos de graça (*) expirados e registra ciência automática.
(*) Prazo ou período de graça é o período de 10 dias consecutivos a partir da data de realização do ato de comunicação para início da contagem de prazo efetivo.
O prazo de graça começa a contar do dia seguinte ao da disponibilização, independentemente de esse dia ser de expediente no órgão comunicante; não importa
se o dia seguinte da disponibilização é um dia útil ou não. Fonte: Art. 21 da Resolução nr. 185
de 18/12/2013 em http://www.cnj.jus.br/atos-administrativos/atos-da-presidencia/resolucoespresidencia/27241-resolucao-n-185-de-18-de-dezembro-de-2013
log.info("Localizando prazos de graça expirados e registrando a ciência automatizada."); registrarCienciaAutomatica(mapaFeriados); => registra a ciência dos expedientes (meio 'E' e talvez 'C') com prazos de graça expirados. ??? Prazo de entrega por correspondencia (parâmetro presuncaoEntregaCorrespondencia) = -1 na base no CNJ vanadiod04 Considera o meio de expediente "Via sistema" ... E se presuncaoEntregaCorrespondencia = -1 não inclui também o expediente "Correios" Critérios: Criteria.isNull("dtCienciaParte") = não tem data de ciência Criteria.in("processoExpediente.meioExpedicaoExpediente", meios.toArray(new ExpedicaoExpedienteEnum[meios.size()])) = somente os expedientes 'E' e talvez 'C' Criteria.equals("fechado", false)) = expedientes não fechados
3.2 - Após obter os expedientes do item 3.1: registra a ciência automática para todos os atos de comunicação (do tipo eletrônico - 'E' e talvez 'C'), considerando as normas relativas à expiração do prazo de graça de que trata a Lei n. 11.419/2006. * Não considera expedientes cujo tipo de prazo é 'Sem prazo' ou 'Data Certa' - Atualiza o campo data de ciência 'dt_ciencia_parte' da tabela 'tb_proc_parte_expediente' - Calcula a data final do prazo processual do respectivo expediente e atualiza o campo 'dt_prazo_legal_parte' da tabela 'tb_proc_parte_expediente'. Caso a data final do prazo processual seja inferior a data atual do sistema, o respectivo expediente será fechado: campo 'in_fechado' da tabela 'tb_proc_parte_expediente' é setado com 'TRUE'. - Caso ocorra alguma exceção e não tenha sido possível registrar a ciência automática para o expediente, um alerta é registrado na tabela 'tb_Alerta', 'tb_processo_alerta' - Caso ocorra alguma exceção e não tenha sido ao recuperar os atos de comunicação pendentes de ciência, uma mensagem de erro é gravada no log e o log é enviado para o email cadastrado no parâmetro "emailSistema".
4- método "registrarDecursoPrazo" - prazos judiciais expirados e lançando a movimentação de decurso pertinente nos processos.
4.1 - Obtém os expedientes cujos prazos processuais estão expirados.
Critérios:
Criteria.equals("fechado", false)) == expedientes ABERTOS
Criteria.not(Criteria.isNull("dtCienciaParte")), == não tem data de ciência dada pela parte
Criteria.not(Criteria.equals("tipoPrazo", TipoPrazoEnum.S)), == o tipo do prazo não é "Sem prazo"
Criteria.less("dtPrazoLegal", date), == a data do prazo legal é inferior a data atual do sistema
Criteria.or( == tipo do prazo é 'data certa' OU prazo legal(campo 'qt_prazo_legal_parte' da tabela 'tb_proc_parte_expediente') é maior que 0(zero).
Criteria.equals("tipoPrazo", TipoPrazoEnum.C),
Criteria.greater("prazoLegal", 0))
4.2 - Após obter os expedientes do item 4.1: registra o decurso de prazo.
- Não registra decurso de prazo para o expediente cujo processo não tem órgão julgador. - Não registra decurso de prazo para o expediente que tenha resposta, resposta intempestiva ou se o expediente já tiver sido fechado. - Não registra decurso de prazo para o expediente se não tiver mapa de feriados registrado para o órgão julgador.
- Para todo expediente cuja data do prazo legal ('dt_prazo_legal_parte' da tabela 'tb_proc_parte_expediente')
seja depois (ou superior) a data atual do sistema:
- Os expedientes cujo tipo do prazo não é 'data certa' e a 'qt_prazo_legal_parte' da tabela 'tb_proc_parte_expediente' não é nula: - Calcula a data final do término do prazo processual (ou 'fim do prazo'): para o cálculo é preciso ter a data da ciência da parte, 'qt_prazo_legal_parte', tipo do prazo e mapa de feriados. - O 'fim do prazo' é atualizado no campo 'dt_prazo_legal_parte' da tabela 'tb_proc_parte_expediente' - Se o 'fim do prazo' é depois (ou superior) a data atual do sistema: expediente será fechado (campo "in_fechado" da tabela 'tb_proc_parte_expediente' recebe TRUE). - É registrado o lançamento do movimento cód. 1051-Decurso de prazo e seus complementos (nome da parte e data) ao processo do expediente em questão.
- Caso ocorra alguma exceção e não tenha sido possível registrar o decurso de prazo para o expediente, um alerta é registrado na tabela 'tb_Alerta', 'tb_processo_alerta' - Caso ocorra alguma exceção e não tenha sido ao recuperar os atos de comunicação pendentes de ciência, uma mensagem de erro é gravada no log e o log é enviado para o email cadastrado no parâmetro "emailSistema".
5- método "cienciaAutomatizadaDiarioEletronico" - rotina do DEJT para cálculo de prazos, lançando movimentação de decurso de prazo.
5.1- Obtém a última data em que as matérias publicadas (atos de comunicação) foram publicadas com sucesso do D.E.: essa data é a última
data de execução com sucesso do job "VerificadorPeriodico" que consta registrada no parâmetro "ultimaDataJobDiario"
5.2- Adiciona-se um dia a última data (definida em 5.1)
5.3- Obtém a data atual do sistema.
{1ª parte // Executa ate o dia anterior da data atual, garantindo que independentemente // do horario do job, sempre traga todas as materias publicadas, ja que o horario de // publicacao pode variar entre os diversos diarios da justica eletronica. // Nao executa a data atual, ja que dependendo do horario, as materias podem ainda nao // terem sido publicadas. } 5.4- Enquanto a data obtida em 5.1 for menor que a data obtida em 5.3 (periodo entre a última data do job com sucesso + 1Dia e a data do sistema) faça: - Verifica se o sistema deve consultar as publicações no DJE pelo recibo de publicação (informado no parâmetro 'pje:publicacao:dje:materia:consultaPeloReciboDePublicacao')
- Se SIM: *** Aqui usa atualizaMateria(processoParteExpediente, data.getTime(), mapFeriados); 5.4.0 - obtém os expedientes "pelo recibo de publicação gerado pelo DJE" na data do job +1Dia e, para cada expediente sem data de ciência será atualizada a data de ciência automática da seguinte forma: 5.4.1 - Calcula a data de publicação do expediente = é a data de disponibilização do expediente no DJE mais um dia útil; esse cálculo é baseado nas regras da Lei n.º 11.419/2006, art. 5.º, com os seguintes esclarecimentos: * a data da disponibilização NÃO é incluída na contagem do prazo de graça de 10 dias. * a data de início de contagem do prazo é o dia seguinte ao da disponibilização, independentemente de esse dia ser ou não dia útil ou dia em que houve suspensão da contagem de prazos. * se o 10º dia da contagem a partir da data da disponibilização for dia não útil, a data considerada como data de intimação será o primeiro dia útil subsequente. 5.4.2 - Calcula a data de ciência automática = é a data de publicação do expediente no DJE mais um dia útil;
esse cálculo é baseado nas regras da Lei n.º 11.419/2006, art. 5.º, com os seguintes esclarecimentos:
* a data da disponibilização NÃO é incluída na contagem do prazo de graça de 10 dias. * a data de início de contagem do prazo é o dia seguinte ao da disponibilização, independentemente de esse dia ser ou não dia útil ou dia em que houve suspensão da contagem de prazos. * se o 10º dia da contagem a partir da data da disponibilização for dia não útil, a data considerada como data de intimação será o primeiro dia útil subsequente. 5.4.3 - Atualiza a data de ciência: campo 'dt_ciencia_parte' da tabela 'tb_proc_parte_expediente' é atualizado. 5.4.4 - Atualiza a data do prazo legal somente do expediente que atende a condição: prazo legal do expediente ('qt_prazo_legal_parte') não for nulo/zero e o Tipo de Prazo diferente de 'Sem prazo' e 'Data certa': => data de prazo legal = a data da ciência adicionada da qtde de dias de 'qt_prazo_legal_parte'; leva em consideração os feriados do órgão e e se a data não for útil considera o dia útil seguinte. 5.4.5 - Lançamento de movimento(s) para o processo do expediente em questão: * Lançado o movimento cód. 1061-Disponibilização no Diário da Justiça Eletrônico; esse código consta cadastrado no parâmetro 'codMovimentoDisponibilizacaoDiario'. Também associa o documento do expediente ao movimento. * Lançado o movimento cód. 92-Publicação e seus complementos (ato publicado e data); esse código consta cadastrado no parâmetro 'codMovimentoPublicacaoDiario'. Também associa o documento do expediente ao movimento.
?????? DÚVIDA: PORQUE EM atualizaMateria usa dtJob+1Dia PARA CALCULAR A DT DE PUBLICAÇÃO E QDO VAI LANÇAR OS MOVIMENTOS EM lancarMovimentosDiario OBTÉM A DATA DE PUBLICAÇÃO A PARTIR DA DT DE CRIAÇÃO DO EXPEDIENTE. ?????? DÚVIDA: aqui não fecha o expediente conforma item 5.4.10
- Se NÃO: *** Aqui usa atualizarMateria(Integer idMateria, final Date data, Map<Integer, List<Feriado>> mapFeriados)
5.4.6 - obtém os expedientes "por data" de publicação no DJE na data do job +1Dia e,
5.4.7 - idem ao 5.4.1
5.4.8 - idem ao 5.4.2
5.4.9 - Se o expediente não tem data de ciência da parte, atualiza a data de ciência calculada em 5.4.7.
5.4.10 - Fecha o expediente.
5.4.10 - Fecha o expediente.
5.4.10 - Fecha o expediente.
5.4.11 - idem ao 5.4.4
5.4.12 - idem ao 5.4.5
- Caso ocorra alguma exceção ao tentar recuperar as matérias do DJE, uma mensagem de erro é gravada no log e o log é enviado para o email cadastrado no parâmetro "emailSistema". - Atualiza o valor do parâmetro "ultimaDataJobDiario" = última data de execução com sucesso do job + 1Dia.
5.5 - { 2ª parte em VerificadorPeriodico // Executa os expedientes pendentes independente da data } - Verifica se o sistema deve consultar as publicações no DJE pelo recibo de publicação (informado no parâmetro 'pje:publicacao:dje:materia:consultaPeloReciboDePublicacao')
- Se SIM: *** Aqui usa atualizarMateriasPendentesPeloCodigoDePublicacaoDJE (feriados) 5.5.1 - obtém os expedientes pendentes independente da data. Critérios: Criteria.equals("processoExpediente.meioExpedicaoExpediente", tipoExpedicao), == MEIO DE EXPEDIÇÃO É DIÁRIO ELETRONICO Criteria.equals("fechado", false), == EXPEDIENTE ABERTO Criteria.isNull("dtCienciaParte"), == EXPEDIENTE SEM DATA DE CIÊNCIA Criteria.isNull("resposta")); == EXPEDIENTE SEM RESPOSTA
5.5.2 - Para os expedientes obtidos em 5.5.1 cuja data de publicação (recuperada por meio do recibo de publicação no DJE) não é nula: - Usa o método atualizaMateria(processoParteExpediente, c.getTime(), mapFeriados) => repete os comportamentos de 5.4.1, 5.4.2, 5.4.3, 5.4.4 e 5.4.5.
- Se NÃO: *** Aqui usa atoComunicacaoService.recuperarMateriasPendentes()
5.5.3 - obtém os expedientes pendentes cujos critérios são:
Criteria.equals("meioExpedicaoExpediente", ExpedicaoExpedienteEnum.P), == MEIO DE EXPEDIÇÃO É DIÁRIO ELETRONICO
Criteria.equals("processoParteExpedienteList.fechado", false), == EXPEDIENTE ABERTO
Criteria.isNull("processoParteExpedienteList.dtCienciaParte"), == EXPEDIENTE SEM DATA DE CIÊNCIA
Criteria.isNull("processoParteExpedienteList.resposta") == EXPEDIENTE SEM RESPOSTA
5.5.4 - Para os expedientes obtidos em 5.5.3 cuja data de publicação (recuperada por meio do recibo de publicação no DJE) não é nula: - Usa o método atualizarMateria(idMateria, c.getTime(), mapFeriados); => repete os comportamentos de 5.4.6 a 5.4.12.
- Caso ocorra alguma exceção ao tentar recuperar as matérias do DJE, uma mensagem de erro é gravada no log e o log é enviado para o email cadastrado no parâmetro "emailSistema".
6- método "sinalizaProsseguimentoSemPrazo()" -- Localizando os prazos judiciais sem prazo e sinalizando para eventual prosseguimento
caso a criação do ato supere o parâmetro [{0}].", Parametros.ESPERA_MAXIMA_SEM_PRAZO);
6.1- Obtém o valor do parâmetro ESPERA_MAXIMA_SEM_PRAZO. Caso o parâmetro não esteja cadastrado, será considerado o valor 30 (dias).
6.2- Obtém os expedientes dados os critérios:
Criteria.equals("fechado", false), == Expedientes abertos
Criteria.or( == Expediente cujo tipo do prazo é 'Sem Prazo' OU prazo legal(campo 'qt_prazo_legal_parte' da tabela 'tb_proc_parte_expediente') é NULL ou igual a 0(zero)
// Expedientes que sejam expressa ou implicitamente sem prazo
Criteria.equals("tipoPrazo", TipoPrazoEnum.S),
Criteria.isNull("prazoLegal"),
Criteria.equals("prazoLegal", 0)
),
Criteria.not(Criteria.equals("tipoPrazo", TipoPrazoEnum.C)), == Expedientes cujo tipo do prazo não seja 'data certa'.
Criteria.less("processoExpediente.dtCriacao", cal.getTime()) == Expedientes cuja data de criação seja inferior a
(data atual do sistema subtraída do valor, em dias, contido no parâmetro ESPERA_MAXIMA_SEM_PRAZO, ou em outras palavras,
expedientes criados nos últimos ESPERA_MAXIMA_SEM_PRAZO dias)
6.3 - Para cada expediente obtido no item 6.2 deverá ser registrado o decurso de prazo -{usa do método método "atoComunicacaoService.sinalizaProsseguimentoSemPrazo"}:
6.3.1 - Fecha o expediente.
6.3.2 - ???? events.raiseAsynchronousEvent(Eventos.EVENTO_PRECLUSAO_MANIFESTACAO, ppe.getProcessoJudicial()); ==>> Não tem nenhum objeto/componente captando o lançamento desse evento.
- Caso ocorra alguma exceção ao tentar recuperar os expedientes,
uma mensagem de erro é gravada no log e o log é enviado para o email cadastrado no parâmetro "emailSistema".
7- Há um tratamento específico para JT: verificação de prazos para os processos que estão na tarefa 'Aguardando Prazo de ED'
e 'Aguardando prazo de Recurso' ... NÃO ESTUDEI!
8- método "fecharPautaAutomaticamente()" -- Rotina para fechamento de pautas automaticamente:
8.1 - Obtém as pautas conforme critérios:
builder.append("SELECT s"); builder.append(" FROM Sessao AS s");
== Seleciona todas as sessões (tb_sessao)
builder.append(" JOIN s.orgaoJulgadorColegiado AS ojc");
== cujos órgãos julgadores colegiados dessas sessões
builder.append(" WHERE ojc.fechamentoAutomatico = true");
== permitem fechamento automático de pauta (tb_orgao_julgador_colgiado.in_fechamento_automatico)
builder.append(" AND (s.dataFechamentoPauta IS NULL OR to_char(s.dataFechamentoPauta, 'YYYYmmdd') > :dataReferencia)");
== e a data de fechamento da pauta da sessão (tb_sessao.dt_fechamento_pauta) é nula ou superior a data atual do sistema
builder.append(" AND (to_char((to_number(to_char(s.dataSessao, 'YYYYmmdd'), '99999999') - ojc.prazoDisponibilizaJulgamento), '99999999') <= :dataReferencia)");
== e a [ data da sessão(tb_sessao.dt_sessao)
- prazo de disponibilização da pauta de julgamento em dias(tb_orgao_julgador_colgiado.nr_disponibilizar_pauta)
]
seja inferior ou igual a data atual do sistema.
8.2 - Para cada pauta obtida no item 8.1: {fecharPauta(Integer idPauta, Date dataFechamento, boolean force) throws PJeBusinessException} 8.2.1- Obtém a 'data prevista' (campo dt_fechamento_pauta) para fechamento da pauta da sessão em questão. - Se a 'data prevista' é não nula e anterior a data de fechamento 'desejada' (parâmetro dataFechamento/data de referência = data atual do sistema) => sistema não termine fechar a pauta e grava msg no log 'Tentativa de fechar pauta de julgamento de sessão [{0}] já fechada ({1}) na data de referência ({2}). Ignorando.", sessao.getIdSessao(), dataPrevista, dataFechamento);' - Se a 'data prevista' é não nula e posterior a data de fechamento 'desejada' (parâmetro dataFechamento/data de referência = data atual do sistema) => sistema não termine fechar a pauta e grava msg no log 'Tentativa de fechar pauta de julgamento de sessão [{0}] com fechamento futuro previsto ({1}). Ignorando.", sessao.getIdSessao(), dataPrevista);' * Rotina é retornada e pauta não é fechada.
8.2.2- Se 'data prevista' está OK (ou seja, passou pelo passo 8.2.1): - Pauta da sessão é fechada - campo dt_fechamento_pauta é atualizado com o valor de dataFechamento/data de referência = data atual do sistema. - Procedimento para intimação automática: - Obtém todos os processos pautados na sessão (tabela tb_sessao_pauta_proc_trf) que foi fechada e para cada processo é feito: - Registro de movimento o processo: cód.417-Inclusão em pauta e seus complementos (data_hora e local) - Se o [Órgão Julgador Colegiado do processo tiver 'Intimação automática da pauta? = true'] E [Tipo de inclusão do processo (campo tp_inclusao da tabela tb_sessao_pauta_proc_trf) é igual a 'PA("Aptos para Pauta")' OU (processo permite intimação (campo in_permite_intimacao da tabela tb_sessao_pauta_proc_trf) não é nula e TRUE) ] - Será intimado os participantes para a sessão de julgamento: - Dados usados para intimar automanticamente: nr do processo, identificação da sessão, tipo do documento (parâmetro idTipoProcessoDocumentoIntimacaoPauta), modelo de documento (parâmetro idModeloIntimacaoPauta), tipo parte advogado (parâmetro idTipoParteAdvogado), valor do parâmetro 'pje:sessao:intimacaoMultipla'('Permite intimação múltipla para as partes'-texto do cadastro do Parâmetro, MAS NO CÓDIGO ESSE PARAMETRO ESTÁ SENDO USADO PARA RESTRINGIR QDO DESEJA INTIMAR SOMENTE ADVOGADO), data da sessão, hora da sessão - Montagem dos destinatários: considera as partes do polo ativo e passivo do processo em questão, porém se o parâmetro 'pje:sessao:intimacaoMultipla' for TRUE somente serão considerados as partes que são advogados. - Intimação é enviada automanticamente para os destinatários: * o tipo do prazo da intimação é 'data certa' * o meio de envio da intimação é 'Enviar via sistema' * a intimação é considerada como 'Documento novo' e esse documento é assinado com certificado pelo 'usuário do sistema' {id_usuário = 0; ds_login= sistema; ds_nome=Usuário do sistema == registrado na tabela acl.tb_usuario_login este usuário é criado pela carga inicial do sistema "carga base limpa"}
- Caso ocorra alguma exceção ao recuperar sessão de julgamento ou fechar pauta de sessão de julgamento ou outro erro,
uma mensagem de alerta é gravada na tabela de Alertas (tb_alerta); se ocorrer erro ao inserir alerta, uma msg de erro é gravada no log e o log é enviado para o email cadastrado no parâmetro "emailSistema". {logService.enviarLogPorEmail}
-->