Class GraRule

java.lang.Object
systextil.bo.inte.gra.GraRule

public class GraRule extends Object
Regras da integracao GRA: configuracao, agendamento do ciclo na OPER_001 (modos, encerramento e "Forcar execucao") e as chamadas a API do GRA (pedidos, referencias cruzadas e NF-e).
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static final record 
    Resposta de uma chamada a API do GRA.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    Classe do batch da integracao na OPER_001 (plano, 6.1).
    static final int
    Valor de OPER_001.campo_01 no agendamento do "Executar uma vez": o batch inte_f010 processa mesmo com a configuracao inativa e nao reagenda.
    static final int
    Ciclo sem heartbeat por mais que isso conta como morto ou travado (servidor reiniciado, conexao perdida): o batch o encerra, e a tela o mostra em vermelho (design, 8.2 e 8.5).
    static final int
    Codigo da GraRule.RespostaGra quando o GRA nao respondeu, fora dos codigos HTTP: a fila de pedidos e notas o grava em status_http, e a tela mostra "Sem resposta do GRA" (PendenteAnalise, 9.12).
    static final String
    Titulos na lista de processos (plano, 6.5): o agendado e o "Proximo ciclo"; ao comecar, o ciclo volta ao nome normal.
    static final String
     
    static final String
     
    static final int
    Agendado com a hora passada ha mais que isso conta como atraso: o agente batch olha a OPER_001 a cada minuto.
  • Constructor Summary

    Constructors
    Constructor
    Description
    GraRule(br.com.intersys.systextil.connection.AppConnection conn, int empresa)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    adiarAgendamento(int empresa, int minutos, int codigoServidor)
    Adia o agendamento pendente da empresa para daqui a minutos e o passa para o servidor de quem adia: a cadeia fica no servidor que esta rodando, e um pendente esquecido de outro servidor e adotado, em vez de parar a cadeia (PendenteAnalise, 10.3).
    void
    agendarProcesso(Mdi mdi, int codigoBatch, int empresa)
    Proximo ciclo da cadeia (ModoAgendamentoEnum.CICLO): o batch, no inicio do ciclo.
    boolean
    agendarProcesso(Mdi mdi, int codigoBatch, int empresa, ModoAgendamentoEnum modo)
    Agenda o ciclo da empresa na OPER_001 conforme o ModoAgendamentoEnum.
    atualizarStatusNota(String chaveAcesso, String status, String descricao)
    Atualiza o status da NF-e no GRA Cloud.
    GET de um endereco que a API do GRA indica (o XML da NF-e), sem o token.
    Detalhe da NF-e no GRA pela chave de acesso: cabecalho e itens, cada um com o vinculo ao pedido de compra (numero e linha).
    buscarNfeDisponiveis(int pagina, int status, int filial)
    NF-es disponiveis para a integracao, paginadas, so da filial do ciclo (plano, 6.4): o GRA filtra pelo campo "filial", o mesmo id_filial que o pedido envia (o codigo da empresa).
    buscarReferencia(String codigoFornecedor, String itemFornecedor)
    Registros da referencia no GRA, para achar o id quando a INTE_005 nao o guardou (exclusao).
    int
    encerrarCiclos(int empresa, String motivo, int excetoSolicitacao, int semSinalMinutos)
    Encerra (status -2) os ciclos da integracao da empresa em execucao.
    void
    enfileirarReversaoNota(String chaveAcesso, int empresaNfe)
    Enfileira a reversao de uma nota na INTE_002 (tipo_operacao='D').
    enviarPedido(String jsonPedido)
    Pedido de compra (inclusao, alteracao ou cancelamento): o sync do GRA e idempotente.
    Inclui ou altera ate 100 referencias (upsert pela chave fornecedor + item_fornecedor + um_fornecedor).
    void
    excluirConfig(int empresa)
     
    excluirReferencia(long idGra)
    Exclusao fisica no GRA pelo id (404: ja nao existe).
    int
    forcarExecucao(Mdi mdi, int codigoBatch, int empresa)
    "Forcar execucao" das Configuracoes (design, 8.3): encerra o ciclo em execucao da empresa (travado ou morto tambem; a thread de um ciclo vivo para no proximo heartbeat), apaga os agendamentos pendentes e agenda um ciclo para agora.
     
    int
    intervaloMinutos(int empresa)
    Tempo entre ciclos da configuracao da empresa (5 min se nao informado).
    void
     
    Chamada leve para conferir o token no inicio do ciclo (design, 8.12): o GRA nao tem rota de autenticacao, e um fornecedor que nao existe deixa a resposta vazia e rapida.
    static boolean
    Token recusado pelo GRA (design, 8.12): HTTP 401/403 ou mensagem comecando por "Token JWT", em qualquer codigo, para um token vencido nao ser lido como recusa do conteudo.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • EXECUCAO_UNICA

      public static final int EXECUCAO_UNICA
      Valor de OPER_001.campo_01 no agendamento do "Executar uma vez": o batch inte_f010 processa mesmo com a configuracao inativa e nao reagenda.
      See Also:
    • CLASSE_BATCH

      public static final String CLASSE_BATCH
      Classe do batch da integracao na OPER_001 (plano, 6.1). O agente batch carrega a classe por este nome: os registros com o nome antigo (br.com.intersys.systextil.batch.gra.inte_f010) sao trocados pelo 267153-001-004.ddl.
      See Also:
    • LIMITE_SEM_HEARTBEAT_MINUTOS

      public static final int LIMITE_SEM_HEARTBEAT_MINUTOS
      Ciclo sem heartbeat por mais que isso conta como morto ou travado (servidor reiniciado, conexao perdida): o batch o encerra, e a tela o mostra em vermelho (design, 8.2 e 8.5). Bem acima do maior intervalo entre heartbeats: uma tentativa com as chamadas HTTP no timeout.
      See Also:
    • TOLERANCIA_ATRASO_SEGUNDOS

      public static final int TOLERANCIA_ATRASO_SEGUNDOS
      Agendado com a hora passada ha mais que isso conta como atraso: o agente batch olha a OPER_001 a cada minuto.
      See Also:
    • TITULO_CICLO

      public static final String TITULO_CICLO
      Titulos na lista de processos (plano, 6.5): o agendado e o "Proximo ciclo"; ao comecar, o ciclo volta ao nome normal. Estado, dedupe, trava e rotacao filtram por classe e status, nunca pelo titulo.
      See Also:
    • TITULO_PROXIMO_CICLO

      public static final String TITULO_PROXIMO_CICLO
      See Also:
    • TITULO_EXECUCAO_UNICA

      public static final String TITULO_EXECUCAO_UNICA
      See Also:
    • SEM_RESPOSTA

      public static final int SEM_RESPOSTA
      Codigo da GraRule.RespostaGra quando o GRA nao respondeu, fora dos codigos HTTP: a fila de pedidos e notas o grava em status_http, e a tela mostra "Sem resposta do GRA" (PendenteAnalise, 9.12). Antes ia como 500, "Erro Servidor".
      See Also:
  • Constructor Details

    • GraRule

      public GraRule(br.com.intersys.systextil.connection.AppConnection conn, int empresa)
  • Method Details

    • getConfig

      public GraConfigDTO getConfig()
    • salvarConfig

      public void salvarConfig(GraConfigDTO dto)
    • excluirConfig

      public void excluirConfig(int empresa)
    • enfileirarReversaoNota

      public void enfileirarReversaoNota(String chaveAcesso, int empresaNfe)
      Enfileira a reversao de uma nota na INTE_002 (tipo_operacao='D'). O batch inte_f010 processara e enviara o status 'R' ao GRA de forma assincrona. Chamado pela regra de exclusao de nota de entrada quando a integracao GRA esta ativa.
      Parameters:
      chaveAcesso - chave de acesso da NF-e excluida
      empresaNfe - codigo da empresa dona da nota
    • agendarProcesso

      public void agendarProcesso(Mdi mdi, int codigoBatch, int empresa)
      Proximo ciclo da cadeia (ModoAgendamentoEnum.CICLO): o batch, no inicio do ciclo.
    • agendarProcesso

      public boolean agendarProcesso(Mdi mdi, int codigoBatch, int empresa, ModoAgendamentoEnum modo)
      Agenda o ciclo da empresa na OPER_001 conforme o ModoAgendamentoEnum. Um agendamento pendente por empresa, de qualquer codigo de servidor (tp_reg_relatorio): a empresa tem uma cadeia so. Grava a empresa alvo (parametro empresa), e nao mdi.codigo_empresa (empresa logada): a tela padrao da OPER_001 filtra pela empresa de quem esta olhando, e o processo so aparece la gravado com a empresa certa.
      Returns:
      false quando nao agendou nem antecipou: no IMEDIATO, com um ciclo em execucao (o fim dele agenda o proximo); nos outros modos, com um agendamento pendente; em qualquer modo, quando as 5 tentativas acharam o numero ja usado
    • forcarExecucao

      public int forcarExecucao(Mdi mdi, int codigoBatch, int empresa)
      "Forcar execucao" das Configuracoes (design, 8.3): encerra o ciclo em execucao da empresa (travado ou morto tambem; a thread de um ciclo vivo para no proximo heartbeat), apaga os agendamentos pendentes e agenda um ciclo para agora. Tudo na transacao de quem chama.
      Returns:
      ciclos em execucao encerrados
    • encerrarCiclos

      public int encerrarCiclos(int empresa, String motivo, int excetoSolicitacao, int semSinalMinutos)
      Encerra (status -2) os ciclos da integracao da empresa em execucao. A mensagem leva o motivo, o ultimo sinal e a ultima etapa gravada pelo heartbeat, para mostrar onde parou. Sem data_fim_execucao (morreu antes de o BaseThread gravar o inicio), conta a data agendada.
      Parameters:
      excetoSolicitacao - ciclo que nao entra (o do batch que chama); 0: nenhum
      semSinalMinutos - so os sem heartbeat ha mais que isso (servidor reiniciado, conexao perdida ou processo travado); 0: todos
      Returns:
      ciclos encerrados (AppConnection.executeUpdate())
    • adiarAgendamento

      public int adiarAgendamento(int empresa, int minutos, int codigoServidor)
      Adia o agendamento pendente da empresa para daqui a minutos e o passa para o servidor de quem adia: a cadeia fica no servidor que esta rodando, e um pendente esquecido de outro servidor e adotado, em vez de parar a cadeia (PendenteAnalise, 10.3). Continua um pendente por empresa. Sem pendente (configuracao inativada, que apaga os pendentes), nao cria: o batch usa no heartbeat e no fim do ciclo, e a tela no agendamento imediato.
      Parameters:
      codigoServidor - tp_reg_relatorio do ciclo em execucao ou, na tela, o do contexto
      Returns:
      quantidade de agendamentos adiados (AppConnection.executeUpdate())
    • intervaloMinutos

      public int intervaloMinutos(int empresa)
      Tempo entre ciclos da configuracao da empresa (5 min se nao informado).
    • baixar

      public static GraRule.RespostaGra baixar(String url)
      GET de um endereco que a API do GRA indica (o XML da NF-e), sem o token. Nunca lanca excecao: a falha vem como SEM_RESPOSTA.
    • enviarPedido

      public GraRule.RespostaGra enviarPedido(String jsonPedido)
      Pedido de compra (inclusao, alteracao ou cancelamento): o sync do GRA e idempotente.
    • enviarReferencias

      public GraRule.RespostaGra enviarReferencias(String jsonLote)
      Inclui ou altera ate 100 referencias (upsert pela chave fornecedor + item_fornecedor + um_fornecedor).
    • buscarReferencia

      public GraRule.RespostaGra buscarReferencia(String codigoFornecedor, String itemFornecedor)
      Registros da referencia no GRA, para achar o id quando a INTE_005 nao o guardou (exclusao).
    • testarToken

      public GraRule.RespostaGra testarToken()
      Chamada leve para conferir o token no inicio do ciclo (design, 8.12): o GRA nao tem rota de autenticacao, e um fornecedor que nao existe deixa a resposta vazia e rapida. Ver tokenRecusado(systextil.bo.inte.gra.GraRule.RespostaGra).
    • excluirReferencia

      public GraRule.RespostaGra excluirReferencia(long idGra)
      Exclusao fisica no GRA pelo id (404: ja nao existe).
    • tokenRecusado

      public static boolean tokenRecusado(GraRule.RespostaGra resposta)
      Token recusado pelo GRA (design, 8.12): HTTP 401/403 ou mensagem comecando por "Token JWT", em qualquer codigo, para um token vencido nao ser lido como recusa do conteudo.
    • buscarNfeDisponiveis

      public GraRule.RespostaGra buscarNfeDisponiveis(int pagina, int status, int filial)
      NF-es disponiveis para a integracao, paginadas, so da filial do ciclo (plano, 6.4): o GRA filtra pelo campo "filial", o mesmo id_filial que o pedido envia (o codigo da empresa).
    • buscarDetalheNota

      public GraRule.RespostaGra buscarDetalheNota(String chaveAcesso)
      Detalhe da NF-e no GRA pela chave de acesso: cabecalho e itens, cada um com o vinculo ao pedido de compra (numero e linha). O XML do fornecedor nao traz o pedido do cliente.
    • atualizarStatusNota

      public GraRule.RespostaGra atualizarStatusNota(String chaveAcesso, String status, String descricao)
      Atualiza o status da NF-e no GRA Cloud.
      Parameters:
      chaveAcesso - Chave de acesso da nota.
      status - Sucesso = 'S' | Erro = 'E' | Reversao = 'R'
      descricao - Mensagem detalhada sobre o processamento
      Returns:
      a resposta do GRA (ok() no HTTP 2xx); SEM_RESPOSTA tambem quando o JSON nao montou