HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //proc/self/cwd/wp-content/plugins/automatewoo/includes/Actions/Subscriptions/UpdateSchedule.php
<?php

namespace AutomateWoo\Actions\Subscriptions;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Change a subscription's billing period or interval.
 *
 * While the billing schedule is not a line item, this class still extends Action_Subscription_Edit_Item_Abstract
 * as it provides many useful methods for editing a subscription's billing schedule.
 *
 * @since 5.4.0
 */
class UpdateSchedule extends AbstractEditItem {


	/**
	 * Explain to store admin what this action does via a unique title and description.
	 */
	public function load_admin_details() {
		parent::load_admin_details();
		$this->title       = __( 'Update Schedule', 'automatewoo' );
		$this->description = __( 'Update a subscriptions billing period or interval. When combined with an action to modify line items, this can be used to ship products on a different schedule to those which they are billed. After the schedule is updated, the next payment date will also be recalculated using the new schedule.', 'automatewoo' );
	}


	/**
	 * Add billing interval & period selection field to the action's admin UI.
	 */
	public function load_fields() {
		$this->add_billing_period_field();
		$this->add_billing_interval_field();
		$this->add_recalculate_field();
	}


	/**
	 * Method to get the billing schedule to set on the subscription.
	 *
	 * @return array
	 */
	protected function get_object_for_edit() {
		return [
			'billing_interval' => $this->get_option( 'billing_interval' ),
			'billing_period'   => $this->get_option( 'billing_period' ),
		];
	}


	/**
	 * Set the chosen billing interval and period on a subscription.
	 *
	 * @param array            $billing_schedule Billing schedule data. Same data as the return value of @see $this->get_object_for_edit().
	 * @param \WC_Subscription $subscription Instance of the subscription being edited by this action.
	 *
	 * @throws \Exception When there is an error.
	 */
	protected function edit_subscription( $billing_schedule, $subscription ) {

		if ( ! empty( $billing_schedule['billing_interval'] ) ) {
			$subscription->set_billing_interval( $billing_schedule['billing_interval'] );
		}

		if ( ! empty( $billing_schedule['billing_period'] ) ) {
			$subscription->set_billing_period( $billing_schedule['billing_period'] );
		}

		if ( $this->get_option( 'recalculate_dates' ) ) {

			$new_next_payment = $subscription->calculate_date( 'next_payment' );

			if ( $new_next_payment > 0 ) {

				$dates_to_update = array( 'next_payment' => $new_next_payment );

				if ( strtotime( $new_next_payment ) < $subscription->get_time( 'trial_end' ) ) {
					$dates_to_update['trial_end'] = $new_next_payment;
				}

				$subscription->update_dates( array( 'next_payment' => $new_next_payment ) );
			} else { // delete the stored date
				$subscription->delete_date( 'next_payment' );
			}
		}

		$subscription->save();
	}


	/**
	 * Get the note to record on the subscription to record the line item change
	 *
	 * @param mixed $billing_schedule WC_Product, WC_Coupon, or some other WooCommerce data type. Will be the same data type as the return value of @see $this->get_object_for_edit().
	 * @return string
	 */
	protected function get_note( $billing_schedule ) {
		return sprintf(
			__( '%1$s workflow run: updated subscription schedule to renew %2$s %3$s. (Workflow ID: %4$d)', 'automatewoo' ),
			$this->workflow->get_title(),
			wcs_get_subscription_period_interval_strings( $billing_schedule['billing_interval'] ),
			wcs_get_subscription_period_strings( 1, $billing_schedule['billing_period'] ),
			$this->workflow->get_id()
		);
	}


	/**
	 * Add a number field to input the billing interval
	 */
	protected function add_billing_interval_field() {
		$input = new \AutomateWoo\Fields\Number();
		$input->set_min( 1 );
		$input->set_name( 'billing_interval' );
		$input->set_title( __( 'Billing Interval', 'automatewoo' ) );
		$input->set_placeholder( __( 'No change', 'automatewoo' ) );
		$input->set_description( __( 'The frequency to process renewals. For example, if an interval of 3 is input with a chosen Billing Period of "month", then the billing schedule will be set to renew quarterly - every 3 months.', 'automatewoo' ) );

		$this->add_field( $input );
	}


	/**
	 * Add a select field for the billing period
	 */
	protected function add_billing_period_field() {
		$select = new \AutomateWoo\Fields\Select();
		$select->set_required();
		$select->set_name( 'billing_period' );
		$select->set_title( __( 'Billing Period', 'automatewoo' ) );
		$select->set_options( wcs_get_available_time_periods() );
		$this->add_field( $select );
	}


	/**
	 * Add a coupon selection field for this action
	 */
	protected function add_recalculate_field() {
		$field = new \AutomateWoo\Fields\Checkbox();
		$field->set_name( 'recalculate_dates' );
		$field->set_title( __( 'Recalculate Dates', 'automatewoo' ) );
		$field->set_description( __( 'Optionally recalculate the next payment and trial end dates based on the new billing schedule.', 'automatewoo' ) );
		$field->default_to_checked = true;
		$this->add_field( $field );
	}
}