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.