SubscriptionReconciler.java

package com.wavii.config;

import com.wavii.model.User;
import com.wavii.model.enums.Subscription;
import com.wavii.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * Reconciliador de suscripciones canceladas.
 * Tarea programada que revisa periódicamente los usuarios cuyas suscripciones han expirado
 * tras una cancelación y los devuelve al plan FREE.
 * 
 * @author eduglezexp
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class SubscriptionReconciler {

    private final UserRepository userRepository;

    @Scheduled(fixedDelay = 60 * 60 * 1000L)
    @Transactional
    public void reconcileCancelledSubscriptions() {
        LocalDateTime now = LocalDateTime.now();
        List<User> users = userRepository
                .findBySubscriptionCancelAtPeriodEndTrueAndSubscriptionCurrentPeriodEndBeforeAndSubscriptionNot(
                        now,
                        Subscription.FREE);

        for (User user : users) {
            user.setSubscription(Subscription.FREE);
            user.setSubscriptionStatus("canceled");
            user.setSubscriptionCancelAtPeriodEnd(false);
            user.setStripeSubscriptionId(null);
            userRepository.save(user);
            log.info("Suscripcion pasada a FREE por fin de periodo para {}", user.getEmail());
        }
    }
}