Marcar transfers travadas como failed

TLDR: Marca como :failed, no DailyProcessingJob, as transfers travadas em created/pending há mais de 24 h — desbloqueando a guarda de retry que já existe.

Contexto

Uma transfer travada em created (caso Ana Claudia, Asana 1215127614333648) impedia o retry indefinidamente, porque a guarda do ScheduleTransfer bloqueia qualquer nova transfer enquanto existir uma em [:created, :pending, :in_bank_processing]. O webhook do gateway foi perdido.

Objetivos

  • Destravar automaticamente invoices cuja transfer ficou pendurada por perda de webhook
  • Reaproveitar o retry já existente, sem criar um novo mecanismo

Fora de escopo

  • Transfers em in_bank_processing — não são tocadas, mesmo após 24 h

Mudanças

app/jobs/professional_payment_invoices_daily_processing_job.rb — marcar transfers travadas como failed no início do job:

```ruby STALE_TTL = 24.hours

def perform fail_stale_transfers log_expired_invoices process_retryable_invoices end

private

def fail_stale_transfers ProfessionalPaymentInvoiceTransfer .where(status: [:created, :pending]) .where(“created_at < ?”, STALE_TTL.ago) .update_all(status: :failed) end ```

É só isso. Depois disso, o passo process_retryable_invoices já existente retenta a invoice naturalmente na mesma execução do job. Se o gateway enviar depois um webhook done para a transfer antiga, ele sobrescreve o status normalmente.

Casos de teste

Situação Resultado esperado
Transfer created há menos de 24 h inalterada
Transfer created há 24 h ou mais vira :failed
Transfer pending há 24 h ou mais vira :failed
Transfer in_bank_processing há 24 h ou mais inalterada

Como verificar

  1. Rodar docker compose run --rm app bundle exec rspec spec/jobs/professional_payment_invoices_daily_processing_job_spec.rb
  2. Após o deploy: uma invoice com transfer travada deve ser retentada automaticamente na próxima execução do job diário (dentro da janela de 10 dias)

Documentação