Marcar transfers travadas como failed
TLDR: Marca como
:failed, noDailyProcessingJob, as transfers travadas emcreated/pendinghá 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
- Rodar
docker compose run --rm app bundle exec rspec spec/jobs/professional_payment_invoices_daily_processing_job_spec.rb - 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
- Atualizar invoice_payment_flow documentando o TTL de 24 h para transfers
created/pendingtravadas