Done !
| Server IP : 46.105.57.169 / Your IP : 216.73.216.67 Web Server : Apache System : Linux webm002.cluster120.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64 User : verseaumee ( 152031) PHP Version : 8.5.7 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/verseaumee/middletvnew/wp-content/plugins/armember/core/classes/ |
Upload File : |
<?php
if (!class_exists('ARM_pro_ration_feature')) {
class ARM_pro_ration_feature {
var $pro_ration_settings;
var $isMultipleMembershipFeature;
var $isProRationFeature;
function __construct() {
$is_multiple_membership_feature = get_option('arm_is_multiple_membership_feature', 0);
$this->isMultipleMembershipFeature = ($is_multiple_membership_feature == '1') ? true : false;
if ($this->isMultipleMembershipFeature != true) {
$is_pro_ration_feature = get_option('arm_is_pro_ration_feature', 0);
$this->isProRationFeature = ($is_pro_ration_feature == '1') ? true : false;
if( $this->isProRationFeature == true ){
add_filter('arm_calculate_payment_gateway_submit_data', array($this, 'arm_calculate_payment_gateway_submit_data_for_pro_ration'), 10, 5);
add_filter('arm_filter_email_message_type',array($this,'arm_update_member_subscription_date_func'),10,4);
add_filter( 'arm_before_setup_form_content', array($this,'arm_prorata_before_setup_form_content'), 10, 3 );
add_filter('arm_modify_plan_amount_for_coupon',array($this,'arm_modify_plan_amount_for_coupon'),10,5);
add_filter( 'arm_get_recurring_plan_start_date', array($this,'arm_trial_date_for_reccurring_func'),10,3);
add_action('arm_after_global_settings_html',array($this,'arm_prorata_setting_html'),1);
add_filter( 'arm_update_upgrade_downgrade_action_external', array($this,'arm_update_upgrade_downgrade_action_func'),10,1);
}
}
}
function arm_get_protation_data($user_id,$plan_id,$arm_plan_cycle_id=0)
{
global $arm_subscription_plans, $arm_global_settings,$arm_payment_gateways,$ARMember,$wpdb,$wp;
$return_data = array('pro_rata_enabled'=>0,'pro_rata'=>0,'pro_rata_amount'=>0);
$current_user_plan_ids = get_user_meta($user_id, 'arm_user_plan_ids', true);
$current_plan_id = !empty($current_user_plan_ids) ? $current_user_plan_ids[0] : 0;
$suspended_plan_ids = get_user_meta($user_id, 'arm_user_suspended_plan_ids', true);
if(!empty($current_plan_id) && !empty($plan_id) &&
(empty($suspended_plan_ids) || !in_array($current_plan_id,$suspended_plan_ids)))
{
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($current_plan_id);
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($plan_id);
$general_settings = $arm_global_settings->global_settings;
$current_plan_options = $current_plan['arm_subscription_plan_options'];
$is_enable_upgrade_downgrade_action = !empty($current_plan_options['enable_upgrade_downgrade_action']) ? $current_plan_options['enable_upgrade_downgrade_action'] : 0 ;
$pro_ration_method = !empty($general_settings['arm_pro_ration_method']) ? $general_settings['arm_pro_ration_method'] : 'cost_base';
if ($is_enable_upgrade_downgrade_action) {
$is_plan_in_upgrade_downgrade_action_check = '';
if (!empty($current_plan_options['upgrade_plans']) && in_array($plan_id, $current_plan_options['upgrade_plans'])) {
$is_plan_in_upgrade_downgrade_action_check = 'upgrade_action';
}
if( empty($is_plan_in_upgrade_downgrade_action_check) && !empty($current_plan_options['downgrade_plans']) && in_array($plan_id, $current_plan_options['downgrade_plans']))
{
$is_plan_in_upgrade_downgrade_action_check = 'downgrade_action';
}
if (!empty($is_plan_in_upgrade_downgrade_action_check) && $current_plan_options[$is_plan_in_upgrade_downgrade_action_check] == 'immediate' || (!empty($is_plan_in_upgrade_downgrade_action_check) && ($general_settings['arm_enable_reset_billing'] == 1 && $current_plan_options[$is_plan_in_upgrade_downgrade_action_check] == 'on_expire'))) {
if ( $pro_ration_method == 'cost_base' ) {
$return_data = $this->arm_get_pro_ration_cal_cost_base($user_id, $current_plan_id, $plan_id,$arm_plan_cycle_id);
} else if ($pro_ration_method == 'time_base') {
$return_data = $this->arm_get_pro_ration_cal_time_base($user_id, $current_plan_id, $plan_id,$arm_plan_cycle_id);
}
}
}
}
return $return_data;
}
function arm_get_pro_ration_cal_cost_base($user_id, $current_plan_id, $new_plan_id,$arm_plan_cycle_id=0,$entry_id=0){
global $wpdb, $ARMember, $arm_subscription_plans, $arm_global_settings;
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($current_plan_id);
$current_planData = get_user_meta($user_id, 'arm_user_plan_' . $current_plan_id, true);
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($new_plan_id);
$general_settings = $arm_global_settings->global_settings;
$arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
$return_data = array('pro_rata_enabled'=>0,'pro_rata'=>0,'pro_rata_amount'=>0,'membership_length'=>0);
$current_membership_type = $current_planData['arm_current_plan_detail']['arm_subscription_plan_type'];
$new_membership_type = $new_plan['arm_subscription_plan_type'];
$current_membership_expires_on = "";
if($current_membership_type == 'paid_finite') {
$current_membership_expires_on = !empty($current_planData['arm_expire_plan']) ? $current_planData['arm_expire_plan'] : 0;
} else if ($current_membership_type == 'recurring') {
$is_current_trial_active = $current_planData['arm_is_trial_plan'];
if ($is_current_trial_active) {
$current_membership_expires_on = !empty($current_planData['arm_trial_end']) ? $current_planData['arm_trial_end'] : 0;
} else {
$current_membership_expires_on = !empty($current_planData['arm_next_due_payment']) ? $current_planData['arm_next_due_payment'] : 0;
}
}
if ($new_membership_type == 'free') {
$return_data = array('pro_rata_enabled'=>0,'pro_rata'=>0,'pro_rata_amount'=>0);
return $return_data;
} else if ($new_membership_type == 'paid_infinite') {
$new_membership_length = 'lifetime';
$new_membership_price = $new_plan['arm_subscription_plan_amount'];
} else if($new_membership_type == 'paid_finite') {
$new_membership_plan_options = $new_plan['arm_subscription_plan_options'];
$new_membership_length_type = $new_membership_plan_options['eopa']['type'];
switch ($new_membership_length_type) {
case 'D':
$new_membership_length_period = $new_membership_plan_options['eopa']['days'];
$new_membership_length_period_type = 'day';
break;
case 'W':
$new_membership_length_period = $new_membership_plan_options['eopa']['weeks'];
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period = $new_membership_plan_options['eopa']['months'];
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period = $new_membership_plan_options['eopa']['years'];
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period = 0;
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
$new_membership_price = $new_plan['arm_subscription_plan_amount'];
} else if ($new_membership_type == 'recurring') {
$new_membership_cycle_id = !empty($arm_plan_cycle_id) ? $arm_plan_cycle_id : 0;
$new_membership_length_period_type = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_type'];
$new_membership_length_period = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_cycle'];
$new_membership_recurring_cycle_count = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['recurring_time'];
switch ($new_membership_length_period_type) {
case 'D':
$new_membership_length_period_type = 'day';
break;
case 'W':
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period_type = '-';
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
$new_membership_price = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['cycle_amount'];
}
if(!empty($entry_id))
{
$arm_hook_return_type = "array";
$new_membership_update_data = apply_filters('arm_modify_membership_plan_amount_external', $new_membership_price, $arm_hook_return_type, $user_id,$new_plan_id, $arm_plan_cycle_id, $new_plan, $entry_id);
$new_membership_price = !empty($new_membership_update_data['plan_amt']) ? $new_membership_update_data['plan_amt'] : $new_membership_price;
$new_plan = !empty($new_membership_update_data['plan_data']) ? $new_membership_update_data['plan_data'] : $new_plan;
}
$current_plan_data = $wpdb->get_row( $wpdb->prepare("SELECT `arm_amount` FROM `" . $ARMember->tbl_arm_payment_log . "` WHERE arm_plan_id = %d AND arm_user_id=%d AND arm_transaction_status IN ('success',1) ORDER BY arm_log_id DESC LIMIT 1", $current_plan_id, $user_id) );
$arm_current_plan_amount = ($current_plan_data->arm_amount != 0) ? $current_plan_data->arm_amount : 0;
if (!empty($general_settings['enable_tax']) && $new_membership_price > 0) {
$tax_percentage = 0;
$tax_display_type= !empty($general_settings['arm_tax_include_exclude_flag']) ? $general_settings['arm_tax_include_exclude_flag'] : 0;
if ($general_settings['tax_type'] == 'country_tax') {
$country_tax_field = !empty($general_settings['country_tax_field']) ? $general_settings['country_tax_field'] : 'country';
$member_data_country = $wpdb->get_var( $wpdb->prepare("SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s",$user_id, $country_tax_field));
$country_tax_arr = (!empty($general_settings['arm_tax_country_name'])) ? maybe_unserialize($general_settings['arm_tax_country_name']) : array();
$country_tax_val_arr = (!empty($general_settings['arm_country_tax_val'])) ? maybe_unserialize($general_settings['arm_country_tax_val']) : array();
$country_default_tax = (!empty($general_settings['arm_country_tax_default_val'])) ? $general_settings['arm_country_tax_default_val'] : 0;
if(!empty($member_data_country) && in_array($member_data_country, $country_tax_arr)) {
$opt_index = array_search($member_data_country, $country_tax_arr);
$tax_percentage = $country_tax_val_arr[$opt_index];
} else {
$tax_percentage = $country_default_tax;
}
} else {
$tax_percentage = $general_settings['tax_amount'];
}
if( empty( $tax_display_type ) )
{
$new_membership_price_tax_amt = ($new_membership_price * $tax_percentage)/100;
$new_membership_price = $new_membership_price + $new_membership_price_tax_amt;
}
}
$arm_prorated_amount = $new_membership_price - $arm_current_plan_amount;
if($arm_prorated_amount<0)
{
$arm_prorated_amount = 0;
}
$return_data = array('pro_rata_enabled'=>1,'pro_rata'=>$arm_current_plan_amount,'pro_rata_amount'=>$arm_prorated_amount,'new_membership_length'=>$new_membership_length,'arm_trial_end_date'=>$current_membership_expires_on,'new_plan'=>$new_plan);
return $return_data;
}
function arm_get_pro_ration_cal_time_base($user_id, $current_plan_id, $new_plan_id,$arm_plan_cycle_id=0,$entry_id=0)
{
global $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_payment_gateways;
$general_settings = $arm_global_settings->global_settings;
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($current_plan_id);
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($new_plan_id);
$current_planData = get_user_meta($user_id, 'arm_user_plan_' . $current_plan_id, true);
$date_format = $arm_global_settings->arm_get_wp_date_format();
$starts_date = !empty($current_planData['arm_start_plan']) ? $current_planData['arm_start_plan'] : '';
$started_date = !empty($current_planData['arm_started_plan_date']) ? $current_planData['arm_started_plan_date'] : '';
$starts_on = !empty($starts_date) ? date_i18n($date_format, $starts_date) : '-';
if($started_date != '' && $started_date <= $starts_date) {
$starts_on = date_i18n($date_format, $started_date);
}
$arm_return_data = array('pro_rata_enabled'=>0,'pro_rata'=>0,'pro_rata_amount'=>0);
$current_membership_type = $current_planData['arm_current_plan_detail']['arm_subscription_plan_type'];
if ($current_membership_type == 'free') {
$arm_return_data = array('pro_rata_enabled'=>0,'pro_rata'=>0,'pro_rata_amount'=>0);
return $arm_return_data;
} else if ($current_membership_type == 'paid_infinite') {
return $this->arm_get_pro_ration_cal_cost_base($user_id, $current_plan_id, $new_plan_id);
} else if($current_membership_type == 'paid_finite') {
$current_membership_expires_on = !empty($current_planData['arm_expire_plan']) ? $current_planData['arm_expire_plan'] : 0;
if($current_plan['arm_subscription_plan_options']['expiry_type'] != 'fixed_date_expiry')
{
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['eopa']['type'];
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['days'];
$current_membership_length_type = 'day';
break;
case 'W':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['weeks'];
$current_membership_length_type = 'week';
break;
case 'M':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['months'];
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['years'];
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_period = 0;
break;
}
if($current_membership_length_period > 1)
{
$current_membership_length_type = $current_membership_length_type.'s';
}
$current_membership_length = "+" . $current_membership_length_period .' '. $current_membership_length_type;
}
else
{
$current_membership_length = '';
$current_membership_expires_on = strtotime($current_plan['arm_subscription_plan_options']['expiry_date']);
}
} else if ($current_membership_type == 'recurring') {
$is_current_trial_active = $current_planData['arm_is_trial_plan'];
if ($is_current_trial_active) {
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['trial']['type'];
} else {
$current_membership_cycle_id = !empty($current_planData['arm_current_plan_detail']['arm_user_selected_payment_cycle']) ? $current_planData['arm_current_plan_detail']['arm_user_selected_payment_cycle'] : 0;
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['payment_cycles'][$current_membership_cycle_id]['billing_type'];
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['payment_cycles'][$current_membership_cycle_id]['billing_cycle'];
}
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_type = 'day';
break;
case 'W':
$current_membership_length_type = 'week';
break;
case 'M':
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_type = '-';
break;
}
if ($is_current_trial_active) {
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['trial']['type'];
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_type = 'day';
break;
case 'M':
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_type = 'day';
break;
}
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['trial'][$current_membership_length_type.'s'];
}
if($current_membership_length_period > 1)
{
$current_membership_length_type = $current_membership_length_type.'s';
}
$current_membership_length = "+" . $current_membership_length_period .' '. $current_membership_length_type;
if ($is_current_trial_active) {
$current_membership_expires_on = !empty($current_planData['arm_trial_end']) ? $current_planData['arm_trial_end'] : 0;
} else {
$current_membership_expires_on = !empty($current_planData['arm_next_due_payment']) ? $current_planData['arm_next_due_payment'] : 0;
}
}
$new_membership_type = $new_plan['arm_subscription_plan_type'];
if ($new_membership_type == 'free') {
$new_membership_length = 'lifetime';
return $arm_return_data;
} else if ($new_membership_type == 'paid_infinite') {
$new_membership_length = 'lifetime';
$new_membership_price = $new_plan['arm_subscription_plan_amount'];
} else if($new_membership_type == 'paid_finite') {
if(!isset($current_plan['arm_subscription_plan_options']['expiry_type']) || $current_plan['arm_subscription_plan_options']['expiry_type'] != 'fixed_date_expiry')
{
$new_membership_plan_options = $new_plan['arm_subscription_plan_options'];
$new_membership_length_type = $new_membership_plan_options['eopa']['type'];
switch ($new_membership_length_type) {
case 'D':
$new_membership_length_period = $new_membership_plan_options['eopa']['days'];
$new_membership_length_period_type = 'day';
break;
case 'W':
$new_membership_length_period = $new_membership_plan_options['eopa']['weeks'];
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period = $new_membership_plan_options['eopa']['months'];
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period = $new_membership_plan_options['eopa']['years'];
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period = 0;
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
}
else
{
$new_membership_length = 'lifetime';
}
$new_membership_price = $new_plan['arm_subscription_plan_amount'];
} else if ($new_membership_type == 'recurring') {
$new_membership_cycle_id = $arm_plan_cycle_id;
$new_membership_length_period_type = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_type'];
$new_membership_length_period = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_cycle'];
switch ($new_membership_length_period_type) {
case 'D':
$new_membership_length_period_type = 'day';
break;
case 'W':
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period_type = '-';
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
$new_membership_price = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['cycle_amount'];
}
if(!empty($entry_id))
{
$arm_hook_return_type = "array";
$new_membership_update_data = apply_filters('arm_modify_membership_plan_amount_external', $new_membership_price, $arm_hook_return_type, $user_id, $new_plan_id, $arm_plan_cycle_id, $new_plan, $entry_id );
$new_membership_price = !empty($new_membership_update_data['plan_amt']) ? $new_membership_update_data['plan_amt'] : $new_membership_price;
$new_plan = !empty($new_membership_update_data['plan_data']) ? $new_membership_update_data['plan_data'] : $new_plan;
}
if (!empty($general_settings['enable_tax']) && $new_membership_price > 0) {
$tax_percentage = 0;
$tax_display_type= !empty($general_settings['arm_tax_include_exclude_flag']) ? $general_settings['arm_tax_include_exclude_flag'] : 0;
if ($general_settings['tax_type'] == 'country_tax') {
$country_tax_field = !empty($general_settings['country_tax_field']) ? $general_settings['country_tax_field'] : 'country';
$member_data_country = $wpdb->get_var( $wpdb->prepare("SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s",$user_id, $country_tax_field));
$country_tax_arr = (!empty($general_settings['arm_tax_country_name'])) ? maybe_unserialize($general_settings['arm_tax_country_name']) : array();
$country_tax_val_arr = (!empty($general_settings['arm_country_tax_val'])) ? maybe_unserialize($general_settings['arm_country_tax_val']) : array();
$country_default_tax = (!empty($general_settings['arm_country_tax_default_val'])) ? $general_settings['arm_country_tax_default_val'] : 0;
if(!empty($member_data_country) && in_array($member_data_country, $country_tax_arr)) {
$opt_index = array_search($member_data_country, $country_tax_arr);
$tax_percentage = $country_tax_val_arr[$opt_index];
} else {
$tax_percentage = $country_default_tax;
}
} else {
$tax_percentage = $general_settings['tax_amount'];
}
if( empty( $tax_display_type ) )
{
$new_membership_price_tax_amt = ($new_membership_price * $tax_percentage)/100;
$new_membership_price = $new_membership_price + $new_membership_price_tax_amt;
}
}
$current_time = strtotime(current_time( 'mysql', true ));
$midnight_today = current_time('timestamp');
if( !empty( $current_membership_length ) )
{
$current_membership_length_seconds = strtotime( $current_membership_length, $midnight_today ) - $midnight_today;
}
else
{
$current_membership_length_seconds = $current_membership_expires_on - $midnight_today;
}
$seconds_until_expires_second = absint( $current_membership_expires_on - $current_time );
$seconds_until_expires = (int)($seconds_until_expires_second / 86400) * 86400 ;
$seconds_used = $current_membership_length_seconds - $seconds_until_expires;
$percent_used_decimal = $seconds_used / $current_membership_length_seconds;
$current_plan_data = $wpdb->get_row( $wpdb->prepare("SELECT `arm_amount` FROM `" . $ARMember->tbl_arm_payment_log . "` WHERE arm_plan_id = %d AND arm_user_id=%d AND arm_transaction_status = 'success' ORDER BY arm_log_id DESC LIMIT 1", $current_plan_id, $user_id) );
$arm_current_plan_amount = $current_plan_data->arm_amount;
$credit = $arm_current_plan_amount * abs( 1 - $percent_used_decimal );
$current_membership_remaining_day = $seconds_until_expires / DAY_IN_SECONDS;
$arm_prorated_amount = 0;
if ( (!empty($general_settings['arm_enable_reset_billing']) && $general_settings['arm_enable_reset_billing'] == 1 && $new_membership_type == 'recurring' ) || $new_membership_type != 'recurring') {
$arm_prorated_amount = $new_membership_price - $credit;
} else {
//if check with each day amount by plan duration and multiply by remaining day if user's old plan is in trial and deduct with $credit
if ($current_membership_type == 'recurring' && $current_planData['arm_is_trial_plan'] == 1) {
if ( 'lifetime' == $new_membership_length) {
$current_membership_remaining_day = 1;
$new_plan_prorated_amount = $new_membership_price;
} else {
$new_plan_start_date = $current_planData['arm_trial_start'];
$new_plan_expire_date = strtotime($new_membership_length, $new_plan_start_date);
$new_plan_total_day = ($new_plan_expire_date - $new_plan_start_date) / DAY_IN_SECONDS;
$new_plan_prorated_amount = ($new_membership_price / $new_plan_total_day);
}
$arm_prorated_amount = ($new_plan_prorated_amount * $current_membership_remaining_day) - $credit;
} else {
if ( 'lifetime' !== $new_membership_length) {
$new_pkg_length_seconds = strtotime( $new_membership_length, $midnight_today ) - $midnight_today;
$percent_used_decimal = $seconds_used / $new_pkg_length_seconds;
}
if ( 'paid_infinite' === $new_plan['arm_subscription_plan_type']) {
$arm_prorated_amount = $new_membership_price - $credit;
} else {
// What percentage of the new mebership plan time is left (in decimal form).
$new_plan_start_date = $current_planData['arm_start_plan'];
$new_plan_expire_date = strtotime($new_membership_length, $new_plan_start_date);
$new_plan_total_day = ($new_plan_expire_date - $new_plan_start_date) / DAY_IN_SECONDS;
$new_plan_prorated_amount = ($new_membership_price / $new_plan_total_day);
$current_membership_remaining_day = $seconds_until_expires / DAY_IN_SECONDS;
$arm_prorated_amount = ($new_plan_prorated_amount * $current_membership_remaining_day) - $credit;
}
}
}
if($arm_prorated_amount<0)
{
$arm_prorated_amount = 0;
}
$arm_return_data = array('pro_rata_enabled'=>1,'pro_rata'=>$credit,'pro_rata_amount'=>$arm_prorated_amount,'seconds_until_expires_second'=>$seconds_until_expires_second,'new_membership_length'=>$new_membership_length,'arm_trial_end_date'=>$current_membership_expires_on,'current_membership_remaining_day'=>$current_membership_remaining_day,'new_plan'=>$new_plan);
return $arm_return_data;
}
function arm_prorata_setting_html()
{
if (file_exists(MEMBERSHIP_VIEWS_DIR . '/arm_pro_rata_general_setting.php')) {
require_once( MEMBERSHIP_VIEWS_DIR . '/arm_pro_rata_general_setting.php' );
}
}
function arm_trial_date_for_reccurring_func($user_id,$old_plan_id,$new_plan_id)
{
global $arm_subscription_plans, $arm_global_settings;
$general_settings = $arm_global_settings->global_settings;
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($new_plan_id);
$new_membership_type = $new_plan['arm_subscription_plan_type'];
$old_plan_id = $old_plan_id[0];
$arm_enable_reset_billing = isset($general_settings['arm_enable_reset_billing']) ? $general_settings['arm_enable_reset_billing'] : 0;
if($new_membership_type == 'recurring' && !empty($new_plan['arm_subscription_plan_options']['trial']) && !empty($new_plan['arm_subscription_plan_options']['trial']['is_trial_period'])){
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($old_plan_id);
$planData = get_user_meta($user_id, 'arm_user_plan_' . $old_plan_id, true);
$starts_date = !empty($planData['arm_start_plan']) ? $planData['arm_start_plan'] : '';
$started_date = !empty($planData['arm_started_plan_date']) ? $planData['arm_started_plan_date'] : '';
$membership_type = $current_plan['arm_subscription_plan_type'];
if($membership_type == 'paid_finite') {
$expires_on = !empty($planData['arm_expire_plan']) ? $planData['arm_expire_plan'] : '';
}
else if($membership_type == 'recurring')
{
$expires_on = !empty($planData['arm_next_due_payment']) ? $planData['arm_next_due_payment'] : '';
}
else
{
$start_date = strtotime(current_time( 'mysql' ));
}
$plan_trial_type = $new_plan['arm_subscription_plan_options']['trial']['type'];
switch($plan_trial_type)
{
case 'D':
$trial_period = $new_plan['arm_subscription_plan_options']['trial']['days'];
// $daysin_second = $trial_period * 86400;
$start_date = strtotime('-'.$trial_period.' days',$expires_on);
break;
case 'M':
$trial_period = $new_plan['arm_subscription_plan_options']['trial']['months'];
$start_date = strtotime('-'.$trial_period.' Months',$expires_on);
break;
case 'Y':
$trial_period = $new_plan['arm_subscription_plan_options']['trial']['years'];
$start_date = strtotime('-'.$trial_period.' Years',$expires_on);
break;
default:
$trial_period = $new_plan['arm_subscription_plan_options']['trial']['days'];
$start_date = strtotime('-'.$trial_period.' days',$expires_on);
break;
}
return $start_date;
}
}
function arm_modify_plan_amount_for_coupon($plan_amt,$plan_obj,$payment_cycle,$payment_gateway='',$payment_mode='')
{
global $arm_subscription_plans, $arm_global_settings;
$arm_pro_ration_supported_payment_gateways = $this->arm_check_payment_gateway_allow_pro_ration();
$arm_pro_rata_supported_gateways = $arm_pro_ration_supported_payment_gateways['allow_auto_debit_trial'];
$is_payment_gateway_supported = ( in_array($payment_gateway,$arm_pro_rata_supported_gateways) ) ? 1 : 0;
if($this->isProRationFeature && is_user_logged_in() && ( $plan_obj->is_recurring() && ( ( !empty( $is_payment_gateway_supported ) && $payment_mode == 'auto_debit_subscription' ) || $payment_mode != 'auto_debit_subscription') || !$plan_obj->is_recurring() ) )
{
$payment_cycle = !empty($payment_cycle) ? $payment_cycle : 0;
$user_id = get_current_user_id();
$selected_plan_id = get_user_meta( get_current_user_id(), 'arm_user_last_plan', true );
$plan = new ARM_Plan($selected_plan_id);
$is_recurring = $plan->is_recurring();
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($selected_plan_id);
$general_settings = $arm_global_settings->global_settings;
$arm_enable_reset_billing = !empty($general_settings['arm_enable_reset_billing']) ? 1 : 0;
$protation_amount = $this->arm_get_protation_data($user_id,$plan_obj->ID,$payment_cycle);
if($protation_amount['pro_rata_enabled'])
{
$plan_amt = $protation_amount['pro_rata_amount'];
}
}
return $plan_amt;
}
function arm_prorata_before_setup_form_content($content, $setupID, $setup_data)
{
$content = '';
global $arm_subscription_plans, $arm_global_settings,$ARMember,$wpdb;
if ($this->isProRationFeature && is_user_logged_in()) {
$user_id = get_current_user_id();
$selected_plan_id = get_user_meta( $user_id, 'arm_user_last_plan', true );
$general_settings = $arm_global_settings->global_settings;
if(!empty($selected_plan_id))
{
$plan = new ARM_Plan($selected_plan_id);
$is_recurring = $plan->is_recurring();
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($selected_plan_id);
$is_enable_upgrade_downgrade_action = !empty($current_plan['arm_subscription_plan_options']['enable_upgrade_downgrade_action']) ? $current_plan['arm_subscription_plan_options']['enable_upgrade_downgrade_action'] : '';
if ( $is_enable_upgrade_downgrade_action )
{
$upgrade_plans_ids = !empty($current_plan['arm_subscription_plan_options']['upgrade_plans']) ? $current_plan['arm_subscription_plan_options']['upgrade_plans'] : array();
$updgrade_plan_action = !empty($current_plan['arm_subscription_plan_options']['upgrade_action']) ? $current_plan['arm_subscription_plan_options']['upgrade_action'] : '';
$downgrade_plan_action = !empty($current_plan['arm_subscription_plan_options']['downgrade_action']) ? $current_plan['arm_subscription_plan_options']['downgrade_action'] : '';
$downgrade_plans_ids = !empty($current_plan['arm_subscription_plan_options']['downgrade_plans']) ? $current_plan['arm_subscription_plan_options']['downgrade_plans'] : array();
$upgrade_plans = !empty($current_plan['arm_subscription_plan_options']['upgrade_plans']) ? implode(',',$current_plan['arm_subscription_plan_options']['upgrade_plans']) : '';
$downgrade_plans = !empty($current_plan['arm_subscription_plan_options']['downgrade_plans']) ? implode(',',$current_plan['arm_subscription_plan_options']['downgrade_plans']) : '';
$pro_ration_method = !empty($general_settings['arm_pro_ration_method']) ? $general_settings['arm_pro_ration_method'] : 'cost_base';
$arm_enable_reset_billing = !empty($general_settings['arm_enable_reset_billing']) ? 1 : 0;
$setup_plan_ids = $setup_data['arm_setup_modules']['modules']['plans'];
foreach($setup_plan_ids as $plan_id)
{
$arm_pro_rata_feature_flag = 0;
$data_arm_is_proratation_amount = 0;
if( ( !empty($upgrade_plans_ids) && in_array($plan_id,$upgrade_plans_ids) && ( !empty($updgrade_plan_action) && ( $updgrade_plan_action != 'on_expire' || $arm_enable_reset_billing == 1 ) ) ) || ( !empty($downgrade_plans_ids) && in_array($plan_id,$downgrade_plans_ids) && ( !empty($downgrade_plan_action) && ( $downgrade_plan_action != 'on_expire' || $arm_enable_reset_billing == 1 ) ) ) )
{
$arm_pro_rata_feature_flag = 1;
$data_arm_is_proratation = $this->arm_get_protation_data($user_id,$plan_id);
$data_arm_is_proratation_amount = $data_arm_is_proratation['pro_rata_amount'];
}
$content .= "<input type='hidden' class='arm_pro_rata_feature_".$plan_id."' value='" . $arm_pro_rata_feature_flag . "'/>";
$content .= "<input type='hidden' class='arm_pro_rata_amt_".$plan_id."' value='" . $data_arm_is_proratation_amount . "'/>";
}
}
$allowed_pro_rata_gateways = $this->arm_check_payment_gateway_allow_pro_ration();
$content .= '<input type="hidden" class="arm_prorata_supported_gateway" value="'.implode(',',$allowed_pro_rata_gateways['allow_auto_debit_trial']).'"/>';
}
}
return $content;
}
function arm_prorata_calulate_for_trial($user_id,$plan_id,$current_plan_id,$credit)
{
global $arm_subscription_plans;
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($current_plan_id);
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['trial']['type'];
$current_planData = get_user_meta( $user_id, 'arm_user_plan_'.$current_plan_id, true );
$current_membership_type = $current_planData['arm_current_plan_detail']['arm_subscription_plan_type'];
$current_membership_arm_start_plan = !empty($current_planData['arm_start_plan']) ? $current_planData['arm_start_plan'] : 0;
$current_membership_expires_on = !empty($current_planData['arm_trial_end']) ? $current_planData['arm_trial_end'] : 0;
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_type = 'day';
break;
case 'M':
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_type = 'day';
break;
}
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['trial'][$current_membership_length_type.'s'];
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($plan_id);
$new_membership_type = $new_plan['arm_subscription_plan_type'];
$new_membership_length_period = 'lifetime';
$new_membership_price = $new_plan['arm_subscription_plan_amount'];
if ($new_membership_type == 'paid_infinite') {
$new_membership_length_period = 'lifetime';
$new_membership_price = $new_plan['arm_subscription_plan_amount'];
} else if($new_membership_type == 'paid_finite') {
$new_membership_plan_options = $new_plan['arm_subscription_plan_options'];
$new_membership_length_type = $new_membership_plan_options['eopa']['type'];
switch ($new_membership_length_type) {
case 'D':
$new_membership_length_period = $new_membership_plan_options['eopa']['days'];
$new_membership_length_period_type = 'day';
case 'W':
$new_membership_length_period = $new_membership_plan_options['eopa']['weeks'];
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period = $new_membership_plan_options['eopa']['months'];
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period = $new_membership_plan_options['eopa']['years'];
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period = 0;
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
$new_membership_price = $new_plan['arm_subscription_plan_amount'];
} else if ($new_membership_type == 'recurring') {
$new_membership_cycle_id = 0;
$new_membership_length_period_type = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_type'];
$new_membership_length_period = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_cycle'];
switch ($new_membership_length_period_type) {
case 'D':
$new_membership_length_period_type = 'day';
case 'W':
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period_type = '-';
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
$new_membership_price = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['cycle_amount'];
}
$current_time = strtotime(current_time( 'mysql', true ));
$midnight_today = strtotime( 'today midnight' );
$seconds_until_expires_second = absint( $current_membership_expires_on - $current_time + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
$seconds_until_expires = (int)($seconds_until_expires_second / 86400) * 86400 ;
$arm_trial_remaining_days = 1;
$arm_new_plan_prorated_amount = $new_membership_price;
if ($current_membership_type == 'recurring' && $current_planData['arm_is_trial_plan'] == 1) {
$new_plan_start_date = $current_planData['arm_trial_start'];
$new_plan_expire_date = strtotime($new_membership_length, $new_plan_start_date);
$new_plan_total_day = ($new_plan_expire_date - $new_plan_start_date) / DAY_IN_SECONDS;
$new_plan_prorated_amount = ($new_membership_price / $new_plan_total_day);
$current_membership_remaining_day = $seconds_until_expires / DAY_IN_SECONDS;
if ( 'lifetime' == $new_membership_length) {
$current_membership_remaining_day = 1;
}
$arm_prorated_amount = ($new_plan_prorated_amount * $current_membership_remaining_day) - $credit;
}
else
{
if($new_membership_length_period != 'lifetime')
{
$new_membership_end_date = strtotime($new_membership_length,$current_membership_arm_start_plan);
$arm_time_calculated = $new_membership_end_date - $current_membership_arm_start_plan;
$arm_days_remaining = $arm_time_calculated / DAY_IN_SECONDS;
$arm_new_plan_prorated_amount = $new_membership_price / $arm_days_remaining;
$arm_trial_remaining_days = $seconds_until_expires / 86400;
}
$arm_prorated_amount = ($arm_new_plan_prorated_amount * $arm_trial_remaining_days) - $credit;
}
return $arm_prorated_amount;
}
function arm_prorata_calulate_percent($plan_id,$percent_used_decimal,$seconds_used)
{
global $arm_subscription_plans;
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($plan_id);
$new_membership_type = $new_plan['arm_subscription_plan_type'];
$new_membership_length = 'lifetime';
if ($new_membership_type == 'paid_infinite') {
$new_membership_length = 'lifetime';
} else if($new_membership_type == 'paid_finite') {
$new_membership_plan_options = $new_plan['arm_subscription_plan_options'];
$new_membership_length_type = $new_membership_plan_options['eopa']['type'];
switch ($new_membership_length_type) {
case 'D':
$new_membership_length_period = $new_membership_plan_options['eopa']['days'];
$new_membership_length_period_type = 'day';
case 'W':
$new_membership_length_period = $new_membership_plan_options['eopa']['weeks'];
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period = $new_membership_plan_options['eopa']['months'];
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period = $new_membership_plan_options['eopa']['years'];
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period = 0;
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
} else if ($new_membership_type == 'recurring') {
$new_membership_cycle_id = 0;
$new_membership_length_period_type = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_type'];
$new_membership_length_period = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['billing_cycle'];
switch ($new_membership_length_period_type) {
case 'D':
$new_membership_length_period_type = 'day';
case 'W':
$new_membership_length_period_type = 'week';
break;
case 'M':
$new_membership_length_period_type = 'month';
break;
case 'Y':
$new_membership_length_period_type = 'year';
break;
default:
$new_membership_length_period_type = '-';
break;
}
if($new_membership_length_period > 1)
{
$new_membership_length_period_type = $new_membership_length_period_type.'s';
}
$new_membership_length = "+" . $new_membership_length_period .' '. $new_membership_length_period_type;
}
$midnight_today = strtotime( 'today midnight' );
if ( 'lifetime' !== $new_membership_length) {
$new_pkg_length_seconds = strtotime( $new_membership_length, $midnight_today ) - $midnight_today;
$percent_used_decimal = $seconds_used / $new_pkg_length_seconds;
}
$percent_remaining_decimal = !empty($percent_used_decimal) ? abs( 1 - $percent_used_decimal ) : 1;
return $percent_remaining_decimal;
}
function arm_get_pro_ration_amount($user_id,$plan_id)
{
global $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_payment_gateways;
$current_plan_id = $plan_id;
$credit = 0;
if(empty($current_plan_id)) {
return $credit;
}
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($current_plan_id);
$planData = get_user_meta($user_id, 'arm_user_plan_' . $current_plan_id, true);
$date_format = $arm_global_settings->arm_get_wp_date_format();
$starts_date = !empty($planData['arm_start_plan']) ? $planData['arm_start_plan'] : '';
$started_date = !empty($planData['arm_started_plan_date']) ? $planData['arm_started_plan_date'] : '';
$starts_on = !empty($starts_date) ? date_i18n($date_format, $starts_date) : '-';
if($started_date != '' && $started_date <= $starts_date) {
$starts_on = date_i18n($date_format, $started_date);
}
$membership_type = $current_plan['arm_subscription_plan_type'];
if ($membership_type == 'paid_infinite') {
$credit = $current_plan['arm_subscription_plan_amount'];
$arm_pro_ration_time_cal = array("credit"=>$credit,"percent_remaining"=>'');
return $arm_pro_ration_time_cal;
} else if($membership_type == 'paid_finite') {
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['eopa']['type'];
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['days'];
$current_membership_length_period_type = 'day';
break;
case 'W':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['weeks'];
$current_membership_length_period_type = 'week';
break;
case 'M':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['months'];
$current_membership_length_period_type = 'month';
break;
case 'Y':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['years'];
$current_membership_length_period_type = 'year';
break;
default:
$current_membership_length_period = 0;
break;
}
if($current_membership_length_period > 1)
{
$current_membership_length_period_type = $current_membership_length_period_type.'s';
}
$current_membership_length = "+" . $current_membership_length_period .' '. $current_membership_length_period_type;
$current_membership_expires_on = !empty($planData['arm_expire_plan']) ? $planData['arm_expire_plan'] : 0;
} elseif ($membership_type == 'recurring') {
$is_current_trial_active = $planData['arm_is_trial_plan'];
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['payment_cycles'][0]['billing_type'];
$current_membership_length = $current_plan['arm_subscription_plan_options']['payment_cycles'][0]['billing_cycle'];
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_type = 'day';
case 'W':
$current_membership_length_type = 'week';
break;
case 'M':
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_type = 'day';
break;
}
if ($is_current_trial_active) {
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['trial']['type'];
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_type = 'day';
break;
case 'M':
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_type = 'day';
break;
}
$current_membership_length = $current_plan['arm_subscription_plan_options']['trial'][$current_membership_length_type.'s'];
}
if($current_membership_length > 1)
{
$current_membership_length_type = $current_membership_length_type.'s';
}
$current_membership_length = "+" . $current_membership_length .' '. $current_membership_length_type;
$current_membership_expires_on = !empty($planData['arm_next_due_payment']) ? $planData['arm_next_due_payment'] : 0;
}
$current_time = strtotime(current_time( 'mysql', true ));
$midnight_today = strtotime( 'today midnight' );
$current_membership_length_seconds = strtotime( $current_membership_length, $midnight_today ) - $midnight_today;
$seconds_until_expires_second = absint( $current_membership_expires_on - $current_time + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
$seconds_until_expires = (int)($seconds_until_expires_second / 86400) * 86400 ;
$seconds_used = $current_membership_length_seconds - $seconds_until_expires;
$percent_used_decimal = $seconds_used / $current_membership_length_seconds;
$current_plan_data = $wpdb->get_row( $wpdb->prepare("SELECT `arm_amount` FROM `" . $ARMember->tbl_arm_payment_log . "` WHERE arm_plan_id = %d AND arm_user_id=%d ORDER BY arm_log_id DESC LIMIT 1", $current_plan_id, $user_id) );
$arm_old_plan_amount = $current_plan_data->arm_amount;
$credit = $arm_old_plan_amount * abs( 1 - $percent_used_decimal );
$percent_remaining_decimal = abs( 1 - $percent_used_decimal );
$arm_pro_ration_time_cal = array("credit"=>$credit,"percent_remaining"=>$percent_remaining_decimal,"seconds_used"=>$seconds_used);
return $arm_pro_ration_time_cal;
}
public function arm_calculate_payment_gateway_submit_data_for_pro_ration( $arm_return_data, $payment_gateway, $payment_gateway_options, $posted_data, $entry_id )
{
global $arm_subscription_plans, $arm_global_settings,$arm_payment_gateways,$ARMember,$wpdb,$wp;
if ($this->isProRationFeature) {
$general_settings = $arm_global_settings->global_settings;
$user_id = $arm_return_data['arm_entry_data']['arm_user_id'];
$new_plan_id = !empty($arm_return_data['arm_plan_obj']->ID) ? $arm_return_data['arm_plan_obj']->ID :0 ;
$plan = !empty($arm_return_data['arm_plan_obj']) ? $arm_return_data['arm_plan_obj'] : new ARM_Plan($new_plan_id);
$is_recurring = $plan->is_recurring();
$old_plan_id = $arm_return_data['arm_entry_data']['arm_entry_value']['arm_user_old_plan'];
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($arm_return_data['arm_entry_data']['arm_entry_value']['arm_user_old_plan']);
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($arm_return_data['arm_plan_obj']->ID);
if(!empty($current_plan) && !empty($new_plan_id) && $new_plan_id != $old_plan_id) {
$current_plan_options = $current_plan['arm_subscription_plan_options'];
$is_enable_upgrade_downgrade_action = !empty($current_plan_options['enable_upgrade_downgrade_action']) ? $current_plan_options['enable_upgrade_downgrade_action'] : 0 ;
$pro_ration_method = !empty($general_settings['arm_pro_ration_method']) ? $general_settings['arm_pro_ration_method'] : 'cost_base';
if ($is_enable_upgrade_downgrade_action) {
$is_plan_in_upgrade_downgrade_action_check = '';
if (!empty($current_plan_options['upgrade_plans']) && in_array($new_plan_id, $current_plan_options['upgrade_plans'])) {
$is_plan_in_upgrade_downgrade_action_check = 'upgrade_action';
}
if( empty($is_plan_in_upgrade_downgrade_action_check) && !empty($current_plan_options['downgrade_plans']) && in_array($new_plan_id, $current_plan_options['downgrade_plans']))
{
$is_plan_in_upgrade_downgrade_action_check = 'downgrade_action';
}
if (!empty($is_plan_in_upgrade_downgrade_action_check) && $current_plan_options[$is_plan_in_upgrade_downgrade_action_check] == 'immediate' || (!empty($is_plan_in_upgrade_downgrade_action_check) && ($general_settings['arm_enable_reset_billing'] == 1 && $current_plan_options[$is_plan_in_upgrade_downgrade_action_check] == 'on_expire'))) {
if ( $pro_ration_method == 'cost_base' ) {
$arm_return_data = $this->arm_pro_ration_cal_cost_base($arm_return_data, $payment_gateway, $payment_gateway_options, $posted_data, $entry_id);
} else if ($pro_ration_method == 'time_base') {
$arm_return_data = $this->arm_pro_ration_cal_time_base($arm_return_data, $payment_gateway, $payment_gateway_options, $posted_data, $entry_id);
}
//update to entries table if plan is upgrade/downgrade
$entry_data = $arm_payment_gateways->arm_get_entry_data_by_id($entry_id);
$entry_values = !empty($entry_data['arm_entry_value']) ? maybe_unserialize($entry_data['arm_entry_value']) : array();
$entry_values['arm_return_data'] = $arm_return_data;
$arm_updated_entry_values = maybe_serialize($entry_values);
$wpdb->update($ARMember->tbl_arm_entries, array('arm_entry_value' => $arm_updated_entry_values), array('arm_entry_id' => $entry_id));
$arm_return_data['arm_entry_data']['arm_return_data'] = maybe_serialize($arm_return_data);
}
}
}
}
return $arm_return_data;
}
public function arm_check_payment_gateway_allow_pro_ration( $payment_gateway='', $trial_days='' )
{
$arm_pro_ration_supported_payment_gateways['arm_is_trial_allowed'] = 0;
$arm_pro_ration_supported_payment_gateways['allow_auto_debit_trial'] = array('paypal', 'stripe', 'paypal_pro', 'paddle');
$arm_pro_ration_supported_payment_gateways['allow_auto_debit_trial_interval'] = array(
'paypal' => array( 'type' => 'D', 'interval' => 90, ),
'stripe' =>array( 'type' => 'D', 'interval' => 365, ),
//'authorize_net' => array( 'type' => 'D', 'interval' => 90, ),
//'2checkout' => array( 'type' => 'D', 'interval' => 0, ),
'paypal_pro' => array( 'type' => 'D', 'interval' => 0, ),
'paddle' => array( 'type' => 'D', 'interval' => 0, ),
//'paystack' => array( 'type' => 'D', 'interval' => 0, ),
);
$arm_pro_ration_supported_payment_gateways = apply_filters('arm_allow_pro_ration_supported_payment_gateway', $arm_pro_ration_supported_payment_gateways);
if(!empty($payment_gateway))
{
$allowed_trial_days = !empty($arm_pro_ration_supported_payment_gateways['allow_auto_debit_trial_interval'][$payment_gateway]['interval']) ? $arm_pro_ration_supported_payment_gateways['allow_auto_debit_trial_interval'][$payment_gateway]['interval'] : 0;
if(in_array($payment_gateway, $arm_pro_ration_supported_payment_gateways['allow_auto_debit_trial'])) {
if ( ($allowed_trial_days != 0 && $trial_days <= $allowed_trial_days) || $allowed_trial_days == 0 ) {
$arm_pro_ration_supported_payment_gateways['arm_is_trial_allowed'] = 1;
}
}
}
return $arm_pro_ration_supported_payment_gateways;
}
public function arm_pro_ration_cal_cost_base( $arm_return_data, $payment_gateway, $payment_gateway_options, $posted_data, $entry_id )
{
global $wpdb, $ARMember, $arm_subscription_plans, $arm_global_settings;
$user_id = $arm_return_data['arm_entry_data']['arm_user_id'];
$current_plan_id = $arm_return_data['arm_entry_data']['arm_entry_value']['arm_user_old_plan'];
$new_plan_id = $arm_return_data['arm_plan_obj']->ID;
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($current_plan_id);
$current_planData = get_user_meta($user_id, 'arm_user_plan_' . $current_plan_id, true);
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($new_plan_id);
$general_settings = $arm_global_settings->global_settings;
$arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
$new_membership_cycle_id = !empty($arm_return_data['arm_entry_data']['arm_entry_value']['arm_payment_cycle_plan_'.$new_plan_id]) ? $arm_return_data['arm_entry_data']['arm_entry_value']['arm_payment_cycle_plan_'.$new_plan_id] :0;
$current_membership_type = $current_planData['arm_current_plan_detail']['arm_subscription_plan_type'];
$arm_cost_base_prorated_amount = $this->arm_get_pro_ration_cal_cost_base($user_id,$current_plan_id,$new_plan_id,$new_membership_cycle_id,$entry_id);
$new_plan = !empty($arm_cost_base_prorated_amount['new_plan']) ? $arm_cost_base_prorated_amount['new_plan'] : $new_plan;
$new_membership_type = $new_plan['arm_subscription_plan_type'];
$arm_prorated_amount = $arm_cost_base_prorated_amount['pro_rata_amount'];
$new_membership_length = $arm_cost_base_prorated_amount['new_membership_length'];
$arm_trial_end_date = $arm_cost_base_prorated_amount['arm_trial_end_date'];
$payment_mode = $arm_return_data['arm_payment_mode'];
$is_payment_gateway_support = 1;
if ($new_membership_type == 'recurring') {
$date_format = $arm_global_settings->arm_get_wp_date_format();
$startDate = current_datetime()->format($date_format);
$endDate = $startDate;
$endDate = strtotime($new_membership_length,strtotime($endDate));
$interval = $endDate - strtotime($startDate);
$trial_days = $interval/86400;
$is_payment_gateway_support_allowed = $this->arm_check_payment_gateway_allow_pro_ration( $payment_gateway, $trial_days );
$is_payment_gateway_support = !empty($is_payment_gateway_support_allowed['arm_is_trial_allowed']) ? $is_payment_gateway_support_allowed['arm_is_trial_allowed'] : 0;
if(!empty($general_settings['arm_enable_reset_billing']))
{
$arm_trial_end_date = $endDate;
}
}
// $arm_return_data['arm_plan_obj']->amount = $arm_prorated_amount;
/*if( $new_membership_type == 'recurring' && ( ( !empty($arm_return_data['arm_coupon_data'] ) && empty( $arm_return_data['arm_coupon_data']['arm_coupon_on_each_subscriptions'] ) ) ) ){
$arm_return_data['arm_recurring_data']['amount'] = $arm_prorated_amount;
}*/
if ($is_payment_gateway_support) {
$arm_prorated_amount = number_format((float)$arm_prorated_amount, $arm_currency_decimal, '.','');
if (!empty($arm_return_data['arm_coupon_data']) && $arm_prorated_amount > 0 ) {
$arm_coupon_type = $arm_return_data['arm_coupon_data']['discount_type'];
if ($arm_coupon_type == 'percentage') {
$arm_coupon_amount = ($arm_prorated_amount * $arm_return_data['arm_coupon_data']['discount']) / 100;
$arm_prorated_amount = $arm_prorated_amount - number_format((float)$arm_coupon_amount, $arm_currency_decimal, '.','');
} else {
$arm_coupon_amount = $arm_return_data['arm_coupon_data']['discount'];
$arm_prorated_amount = $arm_prorated_amount - number_format((float)$arm_coupon_amount, $arm_currency_decimal, '.','');
}
$arm_return_data['arm_coupon_type']['coupon_amt'] = $arm_coupon_amount;
$arm_return_data['arm_coupon_type']['total_amt'] = $arm_prorated_amount;
$arm_return_data['arm_coupon_data']['coupon_amt'] = $arm_coupon_amount;
$arm_return_data['arm_coupon_data']['total_amt'] = $arm_prorated_amount;
}
if ($arm_prorated_amount <= 0) {
$arm_prorated_amount = 0;
}
if ($new_membership_type != 'recurring') {
$arm_return_data['arm_plan_obj']->amount = $arm_prorated_amount;
}
else
{
$arm_plan_amt = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['cycle_amount'];
if(!empty($arm_return_data['arm_coupon_data']) && !empty($arm_return_data['arm_coupon_data']['arm_coupon_on_each_subscriptions']) )
{
$arm_coupon_type = $arm_return_data['arm_coupon_data']['discount_type'];
if ($arm_coupon_type == 'percentage') {
$arm_plan_coupon_amount = ($arm_plan_amt * $arm_return_data['arm_coupon_data']['discount']) / 100;
$arm_plan_amt = $arm_plan_amt - number_format((float)$arm_plan_coupon_amount, $arm_currency_decimal, '.','');
} else {
$arm_plan_coupon_amount = $arm_return_data['arm_coupon_data']['discount'];
$arm_plan_amt = $arm_plan_amt - number_format((float)$arm_plan_coupon_amount, $arm_currency_decimal, '.','');
}
}
$arm_return_data['arm_plan_obj']->amount = $arm_plan_amt;
$arm_return_data['arm_recurring_data']['amount'] = $arm_plan_amt;
$arm_return_data['arm_plan_obj']->amount = $arm_plan_amt;
}
$arm_return_data['arm_payable_amount'] = $arm_prorated_amount;
$arm_return_data['arm_total_payable_amount'] = $arm_prorated_amount;
$arm_return_data['arm_entry_data']['arm_entry_value']['arm_total_payable_amount'] = $arm_prorated_amount;
$arm_return_data['arm_is_prorated'] = 1;
$arm_return_data['arm_last_plan'] = $current_plan_id;
if(!empty($general_settings['enable_tax']))
{
$arm_return_data['arm_tax_data']['tax_percentage'] = 0;
}
if ($new_membership_type == 'recurring' && !empty($new_plan['arm_subscription_plan_options']['trial']) && in_array($current_membership_type,array('recurring','paid_finite') )) {
$arm_return_data['allow_trial'] = 1;
$arm_return_data['arm_trial_amount'] = $arm_prorated_amount;
$arm_return_data['arm_recurring_data']['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_recurring_data']['trial']['period'] = 'D';
$arm_return_data['arm_recurring_data']['trial']['interval'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_recurring_data']['trial']['type'] = 'Day';
$arm_return_data['arm_trial_data']['is_trial_period'] = 1;
$arm_return_data['arm_trial_data']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_trial_data']['days'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_trial_data']['type'] = 'D';
$arm_return_data['arm_plan_obj']->options['trial']['is_trial_period'] = 1;
$arm_return_data['arm_plan_obj']->options['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_plan_obj']->options['trial']['days'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_plan_obj']->options['trial']['type'] = 'D';
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['is_trial_period'] = 1;
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['days'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['type'] = 'D';
$arm_return_data['arm_plan_obj']->recurring_data['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_plan_obj']->recurring_data['trial']['period'] = 'D';
$arm_return_data['arm_plan_obj']->recurring_data['trial']['interval'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_plan_obj']->recurring_data['trial']['type'] = 'Day';
$arm_return_data['arm_plan_obj']->recurring_data['trial']['is_trial_period'] = 1;
$arm_return_data['arm_trial_amount_for_not_in_plan_trial'] = $arm_prorated_amount;
$arm_return_data['arm_trial_amount_for_not_in_plan_trial_flag'] = 1;
$arm_return_data['arm_remained_days'] = ($trial_days > 0) ? $trial_days : 0;
$arm_return_data['arm_pro_rated_trial'] = 1;
$arm_return_data['arm_trial_end_date'] = $arm_trial_end_date;
}
}
return $arm_return_data;
}
public function arm_pro_ration_cal_time_base( $arm_return_data, $payment_gateway, $payment_gateway_options, $posted_data, $entry_id )
{
global $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_payment_gateways;
$user_id = $arm_return_data['arm_entry_data']['arm_user_id'];
$current_plan_id = $arm_return_data['arm_entry_data']['arm_entry_value']['arm_user_old_plan'];
$new_plan_id = $arm_return_data['arm_plan_id'];
$general_settings = $arm_global_settings->global_settings;
if (empty($current_plan_id) || $current_plan_id == 0) {
return $arm_return_data;
}
$current_plan = $arm_subscription_plans->arm_get_subscription_plan($current_plan_id);
$new_plan = $arm_subscription_plans->arm_get_subscription_plan($new_plan_id);
$current_planData = get_user_meta($user_id, 'arm_user_plan_' . $current_plan_id, true);
$date_format = $arm_global_settings->arm_get_wp_date_format();
$starts_date = !empty($current_planData['arm_start_plan']) ? $current_planData['arm_start_plan'] : '';
$started_date = !empty($current_planData['arm_started_plan_date']) ? $current_planData['arm_started_plan_date'] : '';
$starts_on = !empty($starts_date) ? date_i18n($date_format, $starts_date) : '-';
if($started_date != '' && $started_date <= $starts_date) {
$starts_on = date_i18n($date_format, $started_date);
}
$entry_data = $arm_payment_gateways->arm_get_entry_data_by_id($entry_id);
$current_membership_type = $current_planData['arm_current_plan_detail']['arm_subscription_plan_type'];
if ($current_membership_type == 'free') {
return $arm_return_data;
} else if ($current_membership_type == 'paid_infinite') {
return $this->arm_pro_ration_cal_cost_base($arm_return_data, $payment_gateway, $payment_gateway_options, $posted_data, $entry_id);
} else if($current_membership_type == 'paid_finite') {
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['eopa']['type'];
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['days'];
$current_membership_length_type = 'day';
break;
case 'W':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['weeks'];
$current_membership_length_type = 'week';
break;
case 'M':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['months'];
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['eopa']['years'];
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_period = 0;
break;
}
if($current_membership_length_period > 1)
{
$current_membership_length_type = $current_membership_length_type.'s';
}
$current_membership_length = "+" . $current_membership_length_period .' '. $current_membership_length_type;
$current_membership_expires_on = !empty($current_planData['arm_expire_plan']) ? $current_planData['arm_expire_plan'] : 0;
} else if ($current_membership_type == 'recurring') {
$is_current_trial_active = $current_planData['arm_is_trial_plan'];
if ($is_current_trial_active) {
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['trial']['type'];
} else {
$current_membership_cycle_id = $arm_return_data['arm_entry_data']['arm_entry_value']['arm_selected_payment_cycle'];
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['payment_cycles'][$current_membership_cycle_id]['billing_type'];
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['payment_cycles'][$current_membership_cycle_id]['billing_cycle'];
}
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_type = 'day';
break;
case 'W':
$current_membership_length_type = 'week';
break;
case 'M':
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_type = '-';
break;
}
if ($is_current_trial_active) {
$current_membership_length_type = $current_plan['arm_subscription_plan_options']['trial']['type'];
switch ($current_membership_length_type) {
case 'D':
$current_membership_length_type = 'day';
break;
case 'M':
$current_membership_length_type = 'month';
break;
case 'Y':
$current_membership_length_type = 'year';
break;
default:
$current_membership_length_type = 'day';
break;
}
$current_membership_length_period = $current_plan['arm_subscription_plan_options']['trial'][$current_membership_length_type.'s'];
}
if($current_membership_length_period > 1)
{
$current_membership_length_type = $current_membership_length_type.'s';
}
$current_membership_length = "+" . $current_membership_length_period .' '. $current_membership_length_type;
if ($is_current_trial_active) {
$current_membership_expires_on = !empty($current_planData['arm_trial_end']) ? $current_planData['arm_trial_end'] : 0;
} else {
$current_membership_expires_on = !empty($current_planData['arm_next_due_payment']) ? $current_planData['arm_next_due_payment'] : 0;
}
} else {
return $arm_return_data;
}
$new_membership_type = $new_plan['arm_subscription_plan_type'];
$new_membership_cycle_id = !empty($arm_return_data['arm_entry_data']['arm_entry_value']['arm_payment_cycle_plan_'.$new_plan_id]) ? $arm_return_data['arm_entry_data']['arm_entry_value']['arm_payment_cycle_plan_'.$new_plan_id] : 0;
$arm_time_base_prorated_amount = $this->arm_get_pro_ration_cal_time_base($user_id,$current_plan_id,$new_plan_id,$new_membership_cycle_id,$entry_id);
$new_plan = !empty($arm_time_base_prorated_amount['new_plan']) ? $arm_time_base_prorated_amount['new_plan'] : $new_plan;
$arm_prorated_amount = $arm_time_base_prorated_amount['pro_rata_amount'];
$new_membership_length = $arm_time_base_prorated_amount['new_membership_length'];
$seconds_until_expires_second = $arm_time_base_prorated_amount['seconds_until_expires_second'];
$arm_trial_end_date = $arm_time_base_prorated_amount['arm_trial_end_date'];
$trial_days = (int)($seconds_until_expires_second / 86400);
$payment_mode = $arm_return_data['arm_payment_mode'];
$is_payment_gateway_support = 1;
if (!empty($general_settings['arm_enable_reset_billing']) && ($new_membership_type == 'recurring' && $payment_mode == 'auto_debit_subscription')) {
$date_format = $arm_global_settings->arm_get_wp_date_format();
$startDate = current_datetime()->format($date_format);
$endDate = $startDate;
$endDate = strtotime($new_membership_length,strtotime($endDate));
$interval = $endDate - strtotime($startDate);
$trial_days = $interval/86400;
$arm_trial_end_date = $endDate;
} else {
$trial_days = (int)($seconds_until_expires_second / 86400);
$arm_trial_end_date = strtotime('+'.$trial_days.' days',current_time('timestamp'));
}
if (!empty($trial_days) && $payment_mode == 'auto_debit_subscription' ) {
$is_payment_gateway_support_allowed = $this->arm_check_payment_gateway_allow_pro_ration( $payment_gateway, $trial_days );
$is_payment_gateway_support = !empty($is_payment_gateway_support_allowed['arm_is_trial_allowed']) ? $is_payment_gateway_support_allowed['arm_is_trial_allowed'] : 0;
}
if ($is_payment_gateway_support) {
$arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
$arm_prorated_amount = number_format((float)$arm_prorated_amount, $arm_currency_decimal, '.','');
if (!empty($arm_return_data['arm_coupon_data']) && $arm_prorated_amount > 0 ) {
$arm_coupon_type = $arm_return_data['arm_coupon_data']['discount_type'];
if ($arm_coupon_type == 'percentage') {
$arm_coupon_amount = ($arm_prorated_amount * $arm_return_data['arm_coupon_data']['discount']) / 100;
$arm_prorated_amount = $arm_prorated_amount - number_format((float)$arm_coupon_amount, $arm_currency_decimal, '.','');
} else {
$arm_coupon_amount = $arm_return_data['arm_coupon_data']['discount'];
$arm_prorated_amount = $arm_prorated_amount - number_format((float)$arm_coupon_amount, $arm_currency_decimal, '.','');
}
$arm_return_data['arm_coupon_type']['coupon_amt'] = $arm_coupon_amount;
$arm_return_data['arm_coupon_type']['total_amt'] = $arm_prorated_amount;
$arm_return_data['arm_coupon_data']['coupon_amt'] = $arm_coupon_amount;
$arm_return_data['arm_coupon_data']['total_amt'] = $arm_prorated_amount;
}
if($new_membership_type != 'recurring')
{
$arm_return_data['arm_plan_obj']->amount = $arm_prorated_amount;
}
else
{
$arm_plan_amt = $new_plan['arm_subscription_plan_options']['payment_cycles'][$new_membership_cycle_id]['cycle_amount'];
if(!empty($arm_return_data['arm_coupon_data']) && !empty($arm_return_data['arm_coupon_data']['arm_coupon_on_each_subscriptions']) )
{
$arm_coupon_type = $arm_return_data['arm_coupon_data']['discount_type'];
if ($arm_coupon_type == 'percentage') {
$arm_plan_coupon_amount = ($arm_plan_amt * $arm_return_data['arm_coupon_data']['discount']) / 100;
$arm_plan_amt = $arm_plan_amt - number_format((float)$arm_plan_coupon_amount, $arm_currency_decimal, '.','');
} else {
$arm_plan_coupon_amount = $arm_return_data['arm_coupon_data']['discount'];
$arm_plan_amt = $arm_plan_amt - number_format((float)$arm_plan_coupon_amount, $arm_currency_decimal, '.','');
}
}
$arm_return_data['arm_plan_obj']->amount = $arm_plan_amt;
$arm_return_data['arm_recurring_data']['amount'] = $arm_plan_amt;
$arm_return_data['arm_plan_obj']->amount = $arm_plan_amt;
}
//calculate with tax if tax module is active
$arm_prorated_amount = number_format((float)$arm_prorated_amount, $arm_currency_decimal, '.','');
if ($arm_prorated_amount <= 0) {
$arm_prorated_amount = 0;
}
$arm_return_data['arm_payable_amount'] = $arm_prorated_amount;
$arm_return_data['arm_total_payable_amount'] = $arm_prorated_amount;
$arm_return_data['arm_entry_data']['arm_entry_value']['arm_total_payable_amount'] = $arm_prorated_amount;
$arm_return_data['arm_is_prorated'] = 1;
$arm_return_data['arm_last_plan'] = $current_plan_id;
if(!empty($general_settings['enable_tax']))
{
if(isset($arm_return_data['arm_tax_data']['tax_percentage']))
{
$arm_return_data['arm_tax_data']['tax_percentage'] = 0;
}
else
{
$arm_return_data['arm_tax_data'] = array('tax_percentage' => 0);
}
}
if ($new_membership_type == 'recurring' && !empty($new_plan['arm_subscription_plan_options']['trial']) && in_array($current_membership_type,array('recurring','paid_finite') )) {
$arm_return_data['allow_trial'] = 1;
$arm_return_data['arm_trial_amount'] = $arm_prorated_amount;
$arm_return_data['arm_trial_amount'] = $arm_prorated_amount;
$arm_return_data['arm_recurring_data']['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_recurring_data']['trial']['period'] = 'D';
$arm_return_data['arm_recurring_data']['trial']['interval'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_recurring_data']['trial']['type'] = 'Day';
$arm_return_data['arm_recurring_data']['trial']['is_trial_period'] = 1;
$arm_return_data['arm_trial_data']['is_trial_period'] = 1;
$arm_return_data['arm_trial_data']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_trial_data']['days'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_trial_data']['type'] = 'D';
$arm_return_data['arm_plan_obj']->options['trial']['is_trial_period'] = 1;
$arm_return_data['arm_plan_obj']->options['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_plan_obj']->options['trial']['days'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_plan_obj']->options['trial']['type'] = 'D';
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['is_trial_period'] = 1;
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['days'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_plan_obj']->arm_subscription_plan_options['trial']['type'] = 'D';
$arm_return_data['arm_plan_obj']->recurring_data['trial']['amount'] = $arm_prorated_amount;
$arm_return_data['arm_plan_obj']->recurring_data['trial']['period'] = 'D';
$arm_return_data['arm_plan_obj']->recurring_data['trial']['interval'] = ($trial_days > 0) ? $trial_days : 1;
$arm_return_data['arm_plan_obj']->recurring_data['trial']['type'] = 'Day';
$arm_return_data['arm_plan_obj']->recurring_data['trial']['is_trial_period'] = 1;
$arm_return_data['arm_trial_amount_for_not_in_plan_trial'] = $arm_prorated_amount;
$arm_return_data['arm_trial_amount_for_not_in_plan_trial_flag'] = 1;
$arm_return_data['arm_remained_days'] = ($trial_days > 0) ? $trial_days : 0;
$arm_return_data['arm_pro_rated_trial'] = 1;
$arm_return_data['arm_trial_end_date'] = $arm_trial_end_date;
}
}
return $arm_return_data;
}
function arm_update_member_subscription_date_func($message_type, $plan_id, $is_post_plan, $user_id )
{
global $wp,$wpdb,$ARMember,$arm_manage_communication,$arm_global_settings,$arm_subscription_plans,$arm_payment_gateways,$arm_members_class;
if( !empty( $user_id ) )
{
$entry_data = $wpdb->get_row( $wpdb->prepare( "SELECT arm_entry_id, arm_plan_id, arm_entry_value FROM " . $ARMember->tbl_arm_entries ." WHERE arm_user_id=%d AND arm_plan_id=%d ORDER BY arm_entry_id DESC",$user_id,$plan_id ), ARRAY_A );
//execute query $entry_data =
if(empty($entry_data))
{
$arm_get_entry_id = get_user_meta($user_id,'arm_entry_id',true);
$entry_data = $arm_payment_gateways->arm_get_entry_data_by_id($arm_get_entry_id);
}
else {
$arm_get_entry_id = $entry_data['arm_entry_id'];
}
if( !empty($entry_data) )
{
$entry_values = !empty($entry_data['arm_entry_value']) ? maybe_unserialize($entry_data['arm_entry_value']) : array();
$arm_return_data = !empty($entry_values['arm_return_data']) ? maybe_unserialize($entry_values['arm_return_data']) : array();
if(empty($arm_return_data))
{
$arm_return_data = !empty($entry_values['arm_return_data_used']) ? maybe_unserialize($entry_values['arm_return_data_used']) : array();
}
$last_plan_id = !empty($last_plan_ids[0]) ? $last_plan_ids[0] : 0;
if(!empty($arm_return_data) && !empty( $arm_return_data['arm_is_prorated'] ) )
{
$last_plan_id = !empty($arm_return_data['arm_last_plan']) ? $arm_return_data['arm_last_plan'] :0;
if(!empty($last_plan_id))
{
$general_settings = $arm_global_settings->global_settings;
$current_plan = get_user_meta( $user_id, 'arm_user_plan_'.$last_plan_id, true );
$current_plan = maybe_unserialize( $current_plan );
$arm_enable_reset_billing = isset($general_settings['arm_enable_reset_billing']) ? $general_settings['arm_enable_reset_billing'] : 0;
$arm_pro_ration_method = isset($general_settings['arm_pro_ration_method']) ? $general_settings['arm_pro_ration_method'] : 'cost_base';
$old_plan = new ARM_Plan($last_plan_id);
$arm_plan_start_date = !empty($arm_return_data['arm_plan_start_date']) ? strtotime($arm_return_data['arm_plan_start_date']) : '';
$new_plan = new ARM_Plan($plan_id);
if(!empty($current_plan) && $new_plan->is_recurring() && empty($arm_enable_reset_billing))
{
$payment_cycle = !empty($current_plan['arm_payment_cycle']) ? $current_plan['arm_payment_cycle'] : 0;
$last_plan = $arm_subscription_plans->arm_get_subscription_plan($last_plan_id);
$is_upgraded_downgraded_plan = 0;
if (!empty($last_plan['arm_subscription_plan_options']['upgrade_plans']) && in_array($plan_id, $last_plan['arm_subscription_plan_options']['upgrade_plans'])) {
$is_upgraded_downgraded_plan = 1;
}
if( empty($is_upgraded_downgraded_plan) && !empty($last_plan['arm_subscription_plan_options']['downgrade_plans']) && in_array($plan_id, $last_plan['arm_subscription_plan_options']['downgrade_plans']))
{
$is_upgraded_downgraded_plan = 1;
}
if($is_upgraded_downgraded_plan)
{
$arm_start_date = (!empty($current_plan['arm_start_plan'])) ? $current_plan['arm_start_plan'] : current_time('timestamp');
$arm_end_date ='';
$arm_rec_end_date= '';
$new_plan = new ARM_Plan($plan_id);
$planData = get_user_meta( $user_id, 'arm_user_plan_'.$plan_id, true);
if($old_plan->is_recurring())
{
$old_plan_cycle = !empty($planData['arm_payment_cycle']) ? $planData['arm_payment_cycle'] : 0;
$old_recurring_plan_options = $old_plan->prepare_recurring_data($old_plan_cycle);
$recurring_time = !empty($old_recurring_plan_options['rec_time']) ? $old_recurring_plan_options['rec_time'] : '';
$arm_rec_end_date = $current_plan['arm_next_due_payment'];
if($recurring_time != 'infinite')
{
$arm_end_date = $current_plan['arm_expire_plan'];
}
}
else
{
$arm_rec_end_date = $current_plan['arm_expire_plan'];
$arm_end_date = $current_plan['arm_expire_plan'];
}
//update subscription for user start date and end date
if( (!empty($arm_end_date) || !empty($arm_rec_end_date) ) && !empty($user_id) && !empty($plan_id) )
{
$planData = !empty($planData) ? $planData : array();
$defaultPlanData = $arm_subscription_plans->arm_default_plan_array();
$planData = shortcode_atts($defaultPlanData, $planData);
if(!empty($planData))
{
$planData = maybe_unserialize( $planData );
$new_recurring_plan_options = $new_plan->prepare_recurring_data($payment_cycle);
$recurring_time = !empty($new_recurring_plan_options['rec_time']) ? $new_recurring_plan_options['rec_time'] : '';
$new_expire_plan_date = $new_plan->arm_plan_expire_time($arm_rec_end_date, $planData['arm_payment_mode'], $payment_cycle);
if($new_plan->is_recurring())
{
$arm_activity_plan_end_date = !empty($arm_rec_end_date) ? date('Y-m-d H:i:s',$arm_rec_end_date) : '';
if($recurring_time != 'infinite')
{
$arm_activity_plan_end_date = date('Y-m-d H:i:s', $new_expire_plan_date);
}
$planData['arm_completed_recurring'] = 0;
$planData['arm_next_due_payment'] = !empty($arm_rec_end_date) ? $arm_rec_end_date : '';
}
else
{
$arm_activity_plan_end_date = !empty($new_expire_plan_date) ? date('Y-m-d H:i:s', $new_expire_plan_date) : '';
}
$planData['arm_is_trial_plan'] = 1;
$planData['arm_trial_start']=$arm_start_date;
$planData['arm_trial_end']=$arm_rec_end_date;
$arm_plan_start_date = $arm_rec_end_date;
$planData['arm_start_plan'] = $arm_plan_start_date;
$planData['arm_next_due_payment'] = !empty($arm_rec_end_date) ? $arm_rec_end_date : '';
$planData['arm_expire_plan'] = $new_expire_plan_date;
$planData['arm_pro_rated'] = 1;
$get_activity =$wpdb->get_row($wpdb->prepare("SELECT * FROM ".$ARMember->tbl_arm_activity .' WHERE arm_user_id=%d AND arm_item_id=%d AND arm_action="new_subscription"',$user_id,$plan_id),ARRAY_A);
$arm_activity_plan_due_date = !empty($arm_rec_end_date) ? date('Y-m-d H:i:s', $arm_rec_end_date) : '';
$arm_content = maybe_unserialize( $get_activity['arm_content']);
$arm_content['start']=$arm_rec_end_date;
$arm_content['expire']= !empty($new_expire_plan_date) ? $new_expire_plan_date : '';
$wpdb->update($ARMember->tbl_arm_activity,array('arm_content'=>maybe_serialize( $arm_content ),'arm_activity_plan_start_date'=>date('Y-m-d H:i:s', $arm_start_date),'arm_activity_plan_end_date'=>$arm_activity_plan_end_date,'arm_activity_plan_next_cycle_date'=>$arm_activity_plan_due_date),array('arm_user_id'=>$user_id,'arm_item_id'=>$plan_id));
update_user_meta( $user_id, 'arm_user_plan_'.$plan_id, $planData);
}
}
}
} else {
$payment_cycle = !empty($current_plan['arm_payment_cycle']) ? $current_plan['arm_payment_cycle'] : 0;
$planData = get_user_meta( $user_id, 'arm_user_plan_'.$plan_id, true);
$planData['arm_start_plan'] = $arm_plan_start_date;
$payment_mode = isset($planData['arm_payment_mode']) ? $planData['arm_payment_mode'] : 'manual_subscription';
$arm_plan_due_date = $arm_plan_end_date = '';
if($new_plan->is_recurring())
{
$arm_plan_due_date = $arm_members_class->arm_get_next_due_date($user_id, $plan_id, false, $payment_cycle,$arm_plan_start_date);
$planData['arm_next_due_payment'] = $arm_plan_due_date;
$expire_time = $new_plan->arm_plan_expire_time($arm_plan_start_date, $payment_mode, $payment_cycle);
$planData['arm_expire_plan'] = $expire_time;
}
else
{
if(!$new_plan->is_recurring() && !$new_plan->is_lifetime() && $new_plan->is_paid())
{
$expire_time = $new_plan->arm_plan_expire_time($arm_plan_start_date, $payment_mode, $payment_cycle);
$planData['arm_expire_plan'] = $expire_time;
}
}
$planData['arm_completed_recurring'] = 0;
update_user_meta( $user_id, 'arm_user_plan_'.$plan_id, $planData);
}
$arm_return_data['arm_is_prorated'] = 0; // update pro rated to 0 now.
$entry_values['arm_return_data']=maybe_serialize($arm_return_data);
$arm_updated_entry_values = maybe_serialize($entry_values);
$wpdb->update($ARMember->tbl_arm_entries, array('arm_entry_value' => $arm_updated_entry_values), array('arm_entry_id' => $arm_get_entry_id));
}
}
}
}
return $message_type;
}
function arm_update_upgrade_downgrade_action_func( $change_act )
{
global $arm_global_settings;
if ($this->isProRationFeature && $arm_global_settings->global_settings['arm_enable_reset_billing'] == 1) {
$change_act = 'immediate';
}
return $change_act;
}
}
}
global $arm_pro_ration_feature;
$arm_pro_ration_feature = new ARM_pro_ration_feature();