Newer
Older
tonitalia-pluginsoci / includes / class-renewal-reminders.php
<?php
/**
 * Scheduled renewal reminder emails (January).
 *
 * @package TonItaliaRegistration
 */

defined( 'ABSPATH' ) || exit;

/**
 * Class TON_Reg_Renewal_Reminders
 */
class TON_Reg_Renewal_Reminders {

	const CRON_HOOK = 'ton_reg_renewal_reminders';

	const OPTION_START_YEAR = 'ton_reg_renewal_reminders_start_year';

	/**
	 * First calendar year for which automatic January reminders may be sent.
	 *
	 * @return int
	 */
	public static function get_start_year() {
		$year = (int) get_option( self::OPTION_START_YEAR, 2027 );
		return max( 2000, min( 2100, $year ) );
	}

	/**
	 * @param int $year Target quota year.
	 * @return bool
	 */
	public static function reminders_allowed_for_year( $year ) {
		return (int) $year >= self::get_start_year();
	}

	/**
	 * Register daily cron if not already scheduled.
	 */
	public static function schedule_cron() {
		if ( ! wp_next_scheduled( self::CRON_HOOK ) ) {
			wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', self::CRON_HOOK );
		}
	}

	/**
	 * Clear scheduled cron.
	 */
	public static function unschedule_cron() {
		$timestamp = wp_next_scheduled( self::CRON_HOOK );
		while ( $timestamp ) {
			wp_unschedule_event( $timestamp, self::CRON_HOOK );
			$timestamp = wp_next_scheduled( self::CRON_HOOK );
		}
	}

	/**
	 * Daily cron entry point.
	 */
	public static function run_daily() {
		$current_year = TON_Reg_Membership_Renewals::current_year();
		if ( $current_year < self::get_start_year() ) {
			return;
		}

		$month_day = wp_date( 'm-d' );

		if ( '01-01' === $month_day ) {
			self::process_reminders( 'first', $current_year );
			return;
		}

		if ( '01-25' === $month_day ) {
			self::process_reminders( 'last', $current_year );
		}
	}

	/**
	 * @param string $reminder_type first|last.
	 * @param int    $year          Target calendar year.
	 */
	public static function process_reminders( $reminder_type, $year ) {
		$year = (int) $year;
		if ( $year < 2000 || $year > 2100 || ! self::reminders_allowed_for_year( $year ) ) {
			return;
		}

		$members = TON_Reg_Membership_Renewals::get_unpaid_admitted( $year, $reminder_type );
		if ( empty( $members ) ) {
			return;
		}

		foreach ( $members as $member ) {
			TON_Reg_Mailer::send_renewal_reminder_to_member( $member, $year, $reminder_type );
			TON_Reg_Membership_Renewals::mark_reminder_sent( (int) $member->id, $year, $reminder_type );
		}

		TON_Reg_Mailer::send_renewal_admin_digest( $members, $year, $reminder_type );
	}
}