Fix: contagem inconsistente do funil de progresso de áudio

TLDR: Quem tem completed_at deve contar em “Na metade” também, tornando as colunas Iniciaram/Na metade/Completaram um funil cumulativo consistente.

Contexto

No admin de áudios (AudioAdmin.get_queryset) as colunas de engajamento são calculadas a partir do AudioProgress, que tem um único registro por usuário/áudio. O campo position guarda a posição atual de reprodução.

Regras atuais:

  • Iniciaram: todos os registros de progresso
  • Na metade: position >= total_duration / 2
  • Completaram: completed_at preenchido

Problema: quando o usuário termina o áudio e reescuta, o position volta para perto do início. Esse usuário continua contando em Iniciaram e Completaram, mas deixa de contar em “Na metade” porque a posição atual dele é menor que 50%. Isso quebra a lógica de funil — é possível ter Na metade < Completaram, o que é incoerente, já que quem completou obrigatoriamente passou pela metade.

Objetivos

  • Tornar as colunas um funil cumulativo consistente: Iniciaram >= Na metade >= Completaram
  • Quem tem completed_at conta em todas as etapas anteriores
  • Não contar como “Na metade” quando o áudio não tem duração registrada (total_duration = 0)

Fora de escopo

— (não registrado na spec original)

Mudanças

Funil cumulativo — cada etapa conta quem chegou pelo menos até ali:

  • Iniciaram = todos os registros
  • Chegaram na metade = completed_at IS NOT NULL OU (total_duration > 0 E position >= total_duration / 2)
  • Completaram = completed_at IS NOT NULL

  • apps/audios/admin.py — em AudioAdmin.get_queryset, ajustar o subquery halfway para a regra acima; rótulo da coluna/CSV “Chegaram na metade”
  • apps/engagements/admin.py — em _progress_qs, alinhar o bucket de metade à regra acima e renomear parou_metade → chegaram_metade (no CSV e nos lambdas)
  • tests/audios/test_admin.py — testes do funil: reescutador (completo com position baixo) conta em todas as etapas; total_duration = 0 não conta em “Chegaram na metade”; ajuste do teste multi-usuário e do CSV para a contagem cumulativa
  • tests/engagements/test_models_admin_apps.py — atualizar o teste do export para a semântica cumulativa e o novo nome de coluna

Como verificar

  1. make test test=tests/audios/test_admin.py — todos verdes
  2. Cenário de reescuta (completo com position baixo) passa a aparecer em “Na metade”

Documentação

— (não registrado na spec original)