# Correção de acesso ao plano sem pagamento

## Prompt

Acabei de achar um problema grave.

Fiz uma conta no período de teste, selecionei um plano e fui direcionado para a tela de pagamento. A conta saiu do teste grátis e passou a mostrar o plano selecionado mesmo sem eu concluir o pagamento. Ainda assim, foi possível continuar usando o sistema normalmente.

Isso jamais poderia acontecer: depois de selecionar o plano, o sistema deve aguardar a confirmação do pagamento antes de liberar o acesso.

## Resposta

Diagnóstico confirmado em dois pontos. A seleção do plano atualizava o plano da conta e da assinatura, mas mantinha a assinatura em `TRIAL`. Além disso, a validação central das APIs aplicava a carência de cinco dias a qualquer cobrança pendente, inclusive ao primeiro pagamento, mesmo sem existir período pago anterior.

A correção encerra o trial quando um plano pago é selecionado, altera a assinatura para `PENDING_PAYMENT`, registra o fim do teste e marca a primeira cobrança como pendente. A autorização central agora bloqueia imediatamente uma assinatura pendente que nunca teve período pago. A carência de cinco dias foi preservada somente para renovações de assinaturas que já possuem um período pago anterior. A proteção de rota do frontend também consulta o estado atual da assinatura no backend antes de abrir o sistema, evitando depender apenas da data antiga salva no navegador.

Também foram acrescentados testes para impedir regressão nos cenários de primeiro pagamento pendente, renovação dentro da carência e renovação após a carência. A liberação continua ocorrendo exclusivamente após o webhook autenticado confirmar o pagamento.

Validação concluída com 75 testes do backend aprovados, sintaxe PHP válida, `composer validate`, requisitos de plataforma, Oxlint, ESLint e `vue-tsc --build` sem erros. O build Vite de produção não foi executado sem a confirmação exigida pelas regras do projeto.

## Prompt

O aviso de teste grátis não deve ser sempre fixo; o usuário deve ter a opção de fechá-lo.

## Resposta

O aviso informativo exibido durante o teste grátis passou a mostrar a opção de fechar e respeita a escolha armazenada para a sessão do usuário. O alerta volta a ser obrigatório quando o período de teste vence, pois nesse estado informa um bloqueio que exige a seleção e o pagamento de um plano.

## Prompt

Ainda existem vários problemas na área de pagamento. Os planos cadastrados possuem valores de R$ 120, R$ 220 e R$ 480. Selecionei o plano de R$ 220, mas o resumo mostrou R$ 120 e foi gerada uma cobrança de R$ 120. Foram anexadas imagens da seleção do Plano Plus, do resumo divergente e da cobrança registrada como Plano Básico.

## Resposta

O banco confirmou a inconsistência: a conta e a assinatura estavam vinculadas ao Plano Plus, enquanto a única fatura pendente ainda pertencia ao Plano Básico e tinha valor de R$ 120. A criação do pagamento reutilizava qualquer fatura pendente da conta sem validar o plano e gravava o identificador do plano atual junto ao valor antigo. Também foi constatado que a assinatura paga havia permanecido `ACTIVE` sem período pago por ter vindo do plano gratuito.

A troca de plano agora cancela faturas incompatíveis e suas cobranças pendentes no Asaas antes de criar uma nova fatura. A nova fatura é criada com o plano, valor, assinatura e eventual cupom atuais. Uma conta em plano pago sem período pago passa obrigatoriamente para `PENDING_PAYMENT`.

A geração de Pix, boleto e cartão passou a exigir correspondência entre conta, assinatura, plano, fatura e valor. Cobranças idempotentes antigas também são validadas antes de serem reutilizadas. O frontend lista somente a fatura do plano atual. O webhook rejeita uma confirmação cujo plano ou valor remoto seja diferente da fatura e não ativa a assinatura nesse cenário.

Foram adicionados testes para consistência de pagamento, rejeição de outro plano, rejeição de valor remoto divergente e uma simulação de banco que cancela uma fatura antiga de R$ 120 e cria uma nova para o plano superior com o valor correto.

A conta afetada nas imagens também foi reparada: a cobrança pendente de R$ 120 foi cancelada no Asaas e marcada como excluída localmente; a fatura do Plano Básico foi cancelada; a assinatura passou para `PENDING_PAYMENT`; e foi criada uma nova fatura pendente do Plano Plus no valor de R$ 220. Nenhuma nova cobrança externa foi criada automaticamente.

Validação final: 84 testes do backend aprovados, sintaxe PHP válida, Composer válido, requisitos de plataforma atendidos, Oxlint e ESLint sem avisos ou erros, e `vue-tsc --build` aprovado. O build Vite de produção permanece pendente de confirmação.

## Prompt

Existe um fluxo antigo no qual o usuário seleciona um plano, entra na tela de pagamento e, mesmo sem pagar, fica preso nessa tela. O fluxo deve ser refeito para permitir que o usuário saia da tela de pagamento e volte ao sistema quando ainda tiver acesso válido. O bloqueio nas telas de seleção de plano ou pagamento só deve ocorrer ao sair do período de teste ou quando o pagamento estiver vencido há mais de cinco dias. Mesmo bloqueado, o usuário deve poder sair, efetuando logout.

## Resposta

A seleção de um plano pago passou a ser apenas uma intenção pendente. O plano atual da conta e da assinatura não é mais substituído no momento da escolha: a fatura é criada para o plano selecionado e o novo plano só é aplicado quando o webhook confirma o pagamento. Assim, um cliente que ainda possui um período pago válido pode abandonar a tela de cobrança e continuar usando o sistema com o plano atual.

Nas telas de seleção de plano e pagamento foram adicionadas ações de retorno ao sistema, exibidas somente quando a política de acesso do backend autoriza a conta, e uma ação de sair sempre disponível. A ação de sair encerra a sessão e direciona para o login. Usuários que estão saindo do teste sem período pago anterior permanecem bloqueados até o pagamento; assinaturas vencidas continuam liberadas durante a tolerância de cinco dias e são bloqueadas depois desse prazo.

O resumo e a geração da cobrança agora utilizam o plano da fatura pendente, mesmo quando ele ainda é diferente do plano atual da assinatura. Após a aprovação, o webhook aplica o plano pago à assinatura e à conta. Chargeback e outras suspensões explícitas continuam bloqueando imediatamente.

Validação concluída com 88 testes do backend aprovados, sintaxe PHP válida nos arquivos alterados, Oxlint e ESLint sem avisos ou erros e `vue-tsc --build` aprovado. O build Vite de produção permanece pendente da confirmação exigida pelas regras do projeto.

## Prompt

Ainda continua me mandando para a tela de pagamento, mesmo estando no período de teste.

## Resposta

Foi identificado que a implementação anterior ainda encerrava o `TRIAL` no momento em que o usuário selecionava um plano pago. Também existiam redirecionamentos antigos no login e no layout que usavam diretamente o vencimento armazenado no navegador, em vez da política central da assinatura.

A seleção de um plano agora preserva qualquer acesso que já esteja válido antes da escolha. Isso inclui teste vigente, plano gratuito, período pago ativo e os cinco dias de tolerância. O bloqueio ocorre apenas quando o teste já terminou, quando não existe nenhum acesso anterior ou quando o vencimento ultrapassou os cinco dias. Abrir ou gerar uma cobrança durante o teste não encerra mais o período de avaliação; somente a confirmação do pagamento aplica o novo plano.

O plano dedicado `Teste Grátis`, identificado por tipo `G` e período `T`, também foi corrigido para criar uma assinatura `TRIAL` com início e fim, em vez de uma assinatura gratuita `ACTIVE` sem término. Os redirecionamentos do frontend passaram a consultar exclusivamente a autorização calculada pelo backend.

A conta afetada foi restaurada para o teste original de sete dias, de 16/07/2026 a 23/07/2026. O plano atual voltou a ser `Teste Grátis`, enquanto a fatura pendente do Plano Plus permaneceu no valor de R$ 220 para eventual pagamento antecipado. A recuperação foi registrada no histórico da assinatura.

Validação concluída com 95 testes do backend aprovados, incluindo a propagação do período `T` pelo serviço de assinaturas, sintaxe PHP válida, Oxlint e ESLint sem avisos ou erros e `vue-tsc --build` aprovado. O build Vite de produção permanece pendente de confirmação.
