R-012 — UserTrial marca converted_at quando checkout IBFT é aprovado

TLDR: Quando um usuário existente tem seu checkout IBFT aprovado (status=enabled), o UserTrial ainda aberto (converted_at nulo) é marcado com a data/hora da conversão; conversões já marcadas nunca são sobrescritas.

Given / When / Then

Dado um usuário já existente com um UserTrial ativo (converted_at nulo) Quando a task save_checkout_ibft processa um webhook com status=enabled para esse usuário Então o UserTrial em aberto tem converted_at preenchido com o momento da aprovação

Dado um usuário existente cujo UserTrial já possui converted_at preenchido Quando um novo checkout IBFT é aprovado para esse usuário (ex.: renovação) Então o converted_at original não é sobrescrito

Dado um usuário existente sem nenhum UserTrial Quando o checkout IBFT é aprovado Então nada é alterado em UserTrial e o fluxo de ativação do usuário segue normalmente

Constraints

  • O update usa converted_at__isnull=True como filtro — nunca sobrescreve uma conversão já registrada
  • Só se aplica ao fluxo de usuário existente (user_created is False); a criação de usuário novo não passa por essa marcação

Linked test

tests/webhooks/test_views_tasks_urls.py::test_save_checkout_ibft_sets_converted_at_when_trial_user_activates tests/webhooks/test_views_tasks_urls.py::test_save_checkout_ibft_does_not_overwrite_converted_at_on_renewal tests/webhooks/test_views_tasks_urls.py::test_save_checkout_ibft_does_not_fail_when_existing_user_has_no_trial