Interface ProcessamentoRepository

All Superinterfaces:
io.micronaut.data.repository.CrudRepository<ProcessamentoXls, Long>, io.micronaut.data.repository.GenericRepository<ProcessamentoXls, Long>

@JdbcRepository(dialect=POSTGRES) public interface ProcessamentoRepository extends io.micronaut.data.repository.CrudRepository<ProcessamentoXls, Long>
Persistência JDBC de ProcessamentoXls e atualizações de status.
  • Method Details

    • salvar

      default ProcessamentoXls salvar(ProcessamentoXls processamento)
      Persiste (insere ou atualiza) um processamento de XLS.
      Parameters:
      processamento - entidade a gravar.
      Returns:
      a entidade persistida, com id preenchido em caso de inserção.
    • buscarPorId

      default Optional<ProcessamentoXls> buscarPorId(Long id)
      Busca um processamento pelo seu identificador.
      Parameters:
      id - identificador do processamento.
      Returns:
      o processamento correspondente, ou Optional.empty() se não existir.
    • buscarPorChecksum

      default Optional<ProcessamentoXls> buscarPorChecksum(String checksum)
      Busca um processamento pelo checksum SHA-256 do arquivo enviado.
      Parameters:
      checksum - checksum SHA-256 do arquivo XLS.
      Returns:
      o processamento correspondente, ou Optional.empty() se não existir.
    • findByChecksumSha256

      Optional<ProcessamentoXls> findByChecksumSha256(String checksumSha256)
      Query derivada que localiza um processamento pelo checksum SHA-256 do arquivo.
      Parameters:
      checksumSha256 - checksum SHA-256 do arquivo XLS.
      Returns:
      o processamento correspondente, ou Optional.empty() se não existir.
    • listarPaginado

      @Query("SELECT * FROM xls_processamento\nWHERE (:status IS NULL OR status = :status)\nORDER BY recebido_em DESC\nLIMIT :limit OFFSET :offset\n") List<ProcessamentoXls> listarPaginado(@Nullable String status, int limit, int offset)
      Lista processamentos ordenados por recebido_em decrescente, com paginação e filtro opcional de status.
      Parameters:
      status - status a filtrar; quando null retorna todos os status.
      limit - quantidade máxima de registros a retornar.
      offset - deslocamento inicial da página.
      Returns:
      lista de processamentos da página solicitada (possivelmente vazia).
    • listar

      default List<ProcessamentoXls> listar(int page, int size, String status)
      Lista processamentos por número de página (base zero), convertendo page/size em offset/limit para listarPaginado(String, int, int).
      Parameters:
      page - número da página, começando em 0.
      size - quantidade de registros por página.
      status - status a filtrar; quando null retorna todos os status.
      Returns:
      lista de processamentos da página solicitada (possivelmente vazia).
    • contar

      @Query("SELECT COUNT(*) FROM xls_processamento\nWHERE (:status IS NULL OR status = :status)\n") long contar(@Nullable String status)
      Conta os processamentos, com filtro opcional de status.
      Parameters:
      status - status a filtrar; quando null conta todos os status.
      Returns:
      número total de processamentos que atendem ao filtro.
    • findByStatusOrderByRecebidoEmDesc

      List<ProcessamentoXls> findByStatusOrderByRecebidoEmDesc(ProcessamentoStatus status)
      Query derivada que lista os processamentos de um status, ordenados por recebido_em decrescente.
      Parameters:
      status - status a filtrar.
      Returns:
      lista de processamentos com o status informado (possivelmente vazia).
    • findByConjuntoId

      List<ProcessamentoXls> findByConjuntoId(String conjuntoId)
      Lista os processamentos de um lote (.zip) pelo conjunto_id.
      Parameters:
      conjuntoId - id do lote.
      Returns:
      processamentos do lote (possivelmente vazia).
    • marcarProcessando

      @Query(value="UPDATE xls_processamento\nSET status = 'PROCESSANDO', iniciado_em = :iniciadoEm\nWHERE id = :id\n", readOnly=false) int marcarProcessando(Long id, LocalDateTime iniciadoEm)
      Marca o processamento como PROCESSANDO e grava o instante de início.
      Parameters:
      id - identificador do processamento.
      iniciadoEm - instante em que o processamento começou.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • marcarSucesso

      @Query(value="UPDATE xls_processamento\nSET status = 'SUCESSO',\n concluido_em = :concluidoEm,\n tempo_ms = :tempoMs,\n registros_faturamento = :regFat,\n registros_movimento = :regMov\nWHERE id = :id\n", readOnly=false) int marcarSucesso(Long id, LocalDateTime concluidoEm, long tempoMs, int regFat, int regMov)
      Marca o processamento como SUCESSO, gravando conclusão, duração e os totais brutos de registros de faturamento e movimento.
      Parameters:
      id - identificador do processamento.
      concluidoEm - instante em que o processamento foi concluído.
      tempoMs - duração total do processamento em milissegundos.
      regFat - total de registros de faturamento processados.
      regMov - total de registros de movimento processados.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • atualizarMetricas

      @Query(value="UPDATE xls_processamento\nSET faturamento_inseridas = :fatIns,\n faturamento_atualizadas = :fatUpd,\n faturamento_inalteradas = :fatNoOp,\n faturamento_removidas = :fatDel,\n movimento_inseridas = :movIns,\n movimento_atualizadas = :movUpd,\n movimento_inalteradas = :movNoOp,\n movimento_removidas = :movDel\nWHERE id = :id\n", readOnly=false) int atualizarMetricas(Long id, int fatIns, int fatUpd, int fatNoOp, int fatDel, int movIns, int movUpd, int movNoOp, int movDel)
      Atualiza as 8 métricas de idempotência (V7) para o processamento id. Chamado pelo ProcessamentoProcessador após o BulkUpserter; coexistência com marcarSucesso(Long, LocalDateTime, long, int, int) é deliberada — marcarSucesso grava os totais brutos (uploaded.size()), atualizarMetricas grava o detalhamento diff-aware.
      Parameters:
      id - identificador do processamento.
      fatIns - linhas de faturamento inseridas.
      fatUpd - linhas de faturamento atualizadas.
      fatNoOp - linhas de faturamento inalteradas.
      fatDel - linhas de faturamento removidas.
      movIns - linhas de movimento inseridas.
      movUpd - linhas de movimento atualizadas.
      movNoOp - linhas de movimento inalteradas.
      movDel - linhas de movimento removidas.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • atualizarMetricas

      default int atualizarMetricas(Long id, MesclaResumo r)
      Conveniência: extrai os 8 contadores de MesclaResumo.
      Parameters:
      id - identificador do processamento.
      r - resumo com as métricas de faturamento e movimento.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • atualizarDefesa

      @Query(value="UPDATE xls_processamento\nSET xls_legado = :xlsLegado,\n defesa_marca_ausente_qtd = :marca,\n defesa_modelo_ausente_qtd = :modelo,\n defesa_ano_invalido_qtd = :ano,\n defesa_tipo_frota_ausente_qtd = :tipoFrota,\n defesa_placa_malformada_qtd = :placa\nWHERE id = :id\n", readOnly=false) int atualizarDefesa(Long id, Boolean xlsLegado, Integer marca, Integer modelo, Integer ano, Integer tipoFrota, Integer placa)
      Atualiza as 6 colunas de defesa do cadastro veicular (V11). Chamada após o excelProcessor.processar() pelo ProcessamentoProcessador.

      Quando xlsLegado=true, as 5 contagens são NULL (semântica "não avaliado"). Quando false, contém os totais por motivo da defesa. Spec 006 — Req. 13.

      Parameters:
      id - identificador do processamento.
      xlsLegado - flag de XLS legado (≥80% das linhas sem cadastro).
      marca - contagem MARCA_AUSENTE.
      modelo - contagem MODELO_AUSENTE.
      ano - contagem ANO_INVALIDO.
      tipoFrota - contagem TIPO_FROTA_AUSENTE.
      placa - contagem PLACA_MALFORMADA.
      Returns:
      número de linhas afetadas.
    • marcarErro

      @Query(value="UPDATE xls_processamento\nSET status = 'ERRO',\n concluido_em = :concluidoEm,\n tempo_ms = :tempoMs,\n erro_mensagem = :erro\nWHERE id = :id\n", readOnly=false) int marcarErro(Long id, LocalDateTime concluidoEm, long tempoMs, String erro)
      Marca o processamento como ERRO, gravando conclusão, duração e a mensagem de erro.
      Parameters:
      id - identificador do processamento.
      concluidoEm - instante em que o processamento foi interrompido.
      tempoMs - duração decorrida até a falha, em milissegundos.
      erro - mensagem descritiva do erro.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • atualizarLogArquivo

      @Query(value="UPDATE xls_processamento\nSET log_arquivo = :logArquivo\nWHERE id = :id\n", readOnly=false) int atualizarLogArquivo(Long id, String logArquivo)
      Grava o caminho/nome do arquivo de log associado ao processamento.
      Parameters:
      id - identificador do processamento.
      logArquivo - referência do arquivo de log a gravar.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • atualizarPeriodo

      @Query(value="UPDATE xls_processamento\nSET periodo_inicial = :periodoInicial,\n periodo_final = :periodoFinal\nWHERE id = :id\n", readOnly=false) int atualizarPeriodo(Long id, LocalDate periodoInicial, LocalDate periodoFinal)
      Grava o período (datas inicial e final) coberto pelo processamento.
      Parameters:
      id - identificador do processamento.
      periodoInicial - data inicial do período processado.
      periodoFinal - data final do período processado.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • atualizarObjeto

      @Query(value="UPDATE xls_processamento\nSET objeto_bucket = :bucket,\n objeto_chave = :chave,\n objeto_tamanho_bytes = :tamanhoBytes,\n arquivo_bytes = NULL\nWHERE id = :id\n", readOnly=false) int atualizarObjeto(Long id, String bucket, String chave, long tamanhoBytes)
      Migra a linha para o object storage: grava a referência do objeto (bucket, chave, tamanho) e zera arquivo_bytes. Usada pelo StorageBackfillService.
      Parameters:
      id - identificador do processamento.
      bucket - bucket do objeto.
      chave - chave do objeto.
      tamanhoBytes - tamanho do objeto em bytes.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • atualizarObjetoMantendoBytes

      @Query(value="UPDATE xls_processamento\nSET objeto_bucket = :bucket,\n objeto_chave = :chave,\n objeto_tamanho_bytes = :tamanhoBytes\nWHERE id = :id\n", readOnly=false) int atualizarObjetoMantendoBytes(Long id, String bucket, String chave, long tamanhoBytes)
      Grava a referência do objeto (bucket, chave, tamanho) sem zerar arquivo_bytes. Usada pelo backfill no modo PSQL_GARAGE, em que as duas cópias (Postgres e Garage) coexistem.
      Parameters:
      id - identificador do processamento.
      bucket - bucket do objeto.
      chave - chave do objeto.
      tamanhoBytes - tamanho do objeto em bytes.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • limparArquivoBytes

      @Query(value="UPDATE xls_processamento SET arquivo_bytes = NULL WHERE id = :id", readOnly=false) int limparArquivoBytes(Long id)
      Zera arquivo_bytes de uma linha que já possui objeto no Garage. Usada pelo cleanup do modo GARAGE para linhas migradas anteriormente em PSQL_GARAGE.
      Parameters:
      id - identificador do processamento.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • idsPendentesBackfill

      @Query("SELECT id FROM xls_processamento WHERE arquivo_bytes IS NOT NULL ORDER BY id") List<Long> idsPendentesBackfill()
      Lista os ids de processamentos com binário legado em arquivo_bytes (pendentes de backfill/cleanup para o object storage — usada no modo GARAGE).
      Returns:
      ids das linhas a migrar (possivelmente vazia).
    • idsLegadosSemObjeto

      @Query("SELECT id FROM xls_processamento\nWHERE arquivo_bytes IS NOT NULL AND objeto_chave IS NULL\nORDER BY id\n") List<Long> idsLegadosSemObjeto()
      Lista os ids de processamentos com arquivo_bytes mas sem objeto no Garage — pendentes de cópia no modo PSQL_GARAGE. Diferente de idsPendentesBackfill(), ignora linhas já migradas (que mantêm arquivo_bytes), tornando o backfill PSQL_GARAGE idempotente sem precisar zerar a coluna.
      Returns:
      ids das linhas legadas ainda não copiadas para o Garage (possivelmente vazia).
    • gravarArquivoBytes

      @Query(value="UPDATE xls_processamento SET arquivo_bytes = :bytes WHERE id = :id", readOnly=false) int gravarArquivoBytes(Long id, byte[] bytes)
      Grava o binário do XLS na coluna arquivo_bytes (modos PSQL e PSQL_GARAGE). Método de repositório — gerencia a própria conexão, ao contrário de um DataSource.getConnection() cru sobre o datasource contextual do Micronaut Data, que exigiria uma transação na thread chamadora.
      Parameters:
      id - identificador do processamento.
      bytes - conteúdo binário do arquivo .xlsx.
      Returns:
      número de linhas afetadas (1 quando o id existe).
    • lerArquivoBytesLegado

      default byte[] lerArquivoBytesLegado(Long id)
      Lê o binário legado de arquivo_bytes. A entidade ProcessamentoXls não mapeia mais essa coluna — apenas o backfill a acessa, por esta query raw.
      Parameters:
      id - identificador do processamento.
      Returns:
      bytes do arquivo legado, ou null se a coluna (ou a linha) estiver vazia.
    • projetarArquivoBytesLegado

      @Query("SELECT arquivo_bytes FROM xls_processamento WHERE id = :id") Optional<ArquivoBytesLegado> projetarArquivoBytesLegado(Long id)
      Apoio a lerArquivoBytesLegado(Long): o Micronaut Data exige um tipo introspectado (ArquivoBytesLegado) para projetar o byte[] de arquivo_bytes — um retorno escalar byte[] não é suportado.
      Parameters:
      id - identificador do processamento.
      Returns:
      projeção com o binário legado, ou Optional.empty() se a linha não existir.
    • resetarParaPendente

      @Query(value="UPDATE xls_processamento\nSET status = 'PENDENTE',\n iniciado_em = NULL,\n concluido_em = NULL,\n tempo_ms = NULL,\n erro_mensagem = NULL,\n registros_faturamento = NULL,\n registros_movimento = NULL,\n periodo_inicial = NULL,\n periodo_final = NULL,\n log_arquivo = NULL\nWHERE id = :id\n", readOnly=false) int resetarParaPendente(Long id)
      Reverte o processamento para o status PENDENTE, limpando todos os campos de execução (instantes, duração, erro, contadores, período e log) para permitir reprocessá-lo.
      Parameters:
      id - identificador do processamento.
      Returns:
      número de linhas afetadas (1 quando o id existe).