Eu sugiro que você não armazenou dados suficientes em sua tabela.
Como está agora, você sempre precisará analisar todos os pagamentos anteriores para verificar se o atual está ativo ou aguardando ativação, um grande impacto no desempenho e uma consulta mais complexa.
Um
expires_at
calculado coluna para payments
, que é calculado com a adição de um novo pagamento como MAX(payments.expires_at) + INTERVAL service_plans.days DAYS
permitirá que você calcule o número de dias restantes observando apenas uma linha... e se um usuário está ou não em um plano.