R-018 — Janela do trial é imutável após a criação

TLDR: started_at e expires_at do UserTrial só são escritos na criação, pelo UserTrialService. O admin exibe as duas datas como leitura, sem permitir edição.

Given / When / Then

Dado um UserTrial criado por UserTrialService.create_user_trial, com expires_at = started_at + trial.duration_days gravado também em User.expires_at Quando um administrador abre o registro em dash.*/admin/trials/usertrial/<id>/change/ Então started_at e expires_at aparecem como texto de leitura e não podem ser alterados pelo formulário

Dado o mesmo UserTrial Quando o checkout IBFT do usuário é aprovado (R-012) Então apenas User.expires_at é atualizado com a expiração da assinatura; UserTrial.expires_at permanece com a data original do trial

Restrições

  • UserTrial.expires_at é o registro histórico da janela concedida; User.expires_at é a expiração de acesso vigente (trial ou assinatura). Os dois nascem iguais e divergem a partir da conversão
  • A edição manual das datas dessincronizaria os dois campos sem passar pelo service, fazendo POST /accounts/sign-in e GET /accounts/profile responderem expirações diferentes para o mesmo usuário (R-015)
  • converted_at continua editável no admin — o ajuste manual de conversão é um caso de uso válido
  • A criação de UserTrial pelo admin já é bloqueada por has_add_permission = False

Teste vinculado

tests/trials/test_admin.py — test_trial_window_dates_are_readonly, test_change_form_has_no_editable_trial_window_dates, test_change_form_keeps_converted_at_editable