/** * Checks if the user can be granted the permission to remove a line item from the subscription. * * @param WC_Subscription $subscription An instance of a WC_Subscription object * @since 2.0 */ function wcs_can_items_be_removed($subscription) { $allow_remove = false; if (sizeof($subscription->get_items()) > 1 && $subscription->payment_method_supports('subscription_amount_changes') && $subscription->has_status(array('active', 'on-hold', 'pending'))) { $allow_remove = true; } return apply_filters('wcs_can_items_be_removed', $allow_remove, $subscription); }
/** * If the subscription has expired since upgrading and the end date is not the original expiration date, * we need to unexpire it, which in the case of a previously active subscription means activate it, and * in any other case, leave it as on-hold (a cancelled subscription wouldn't have been expired, so the * status must be on-hold or active). * * @param WC_Subscription $subscription data about the subscription * @return bool true if the trial date was repaired, otherwise false */ protected static function maybe_repair_status($subscription, $former_order_item_meta, $dates_to_update) { if ($subscription->has_status('expired') && 'expired' != $former_order_item_meta['_wcs_migrated_subscription_status'][0] && isset($dates_to_update['end'])) { try { // we need to bypass the update_status() method here because normally an expired subscription can't have it's status changed, we also don't want normal status change hooks to be fired wp_update_post(array('ID' => $subscription->id, 'post_status' => 'wc-on-hold')); // if the payment method doesn't support date changes, we still want to reactivate the subscription but we also need to process a special failed payment at the next renewal to fix up the payment method so we'll set a special flag in post meta to handle that if (!$subscription->payment_method_supports('subscription_date_changes') && $subscription->get_total() > 0) { update_post_meta($subscription->id, '_wcs_repaired_2_0_2_needs_failed_payment', 'true'); WCS_Upgrade_Logger::add(sprintf('For subscription %d: payment method does not support "subscription_date_changes" and total > 0, setting "_wcs_repaired_2_0_2_needs_failed_payment" post meta flag.', $subscription->id)); } if ('active' == $former_order_item_meta['_wcs_migrated_subscription_status'][0] && $subscription->can_be_updated_to('active')) { $subscription->update_status('active'); } WCS_Upgrade_Logger::add(sprintf('For subscription %d: repaired status. Status was "expired", it is now "%s".', $subscription->id, $subscription->get_status())); $repair_status = true; } catch (Exception $e) { WCS_Upgrade_Logger::add(sprintf('!!! For subscription %d: unable to repair status, exception "%s"', $subscription->id, $e->getMessage())); $repair_status = false; } } else { WCS_Upgrade_Logger::add(sprintf('For subscription %d: no need to repair status, current status: %s; former status: %s.', $subscription->id, $subscription->get_status(), $former_order_item_meta['_wcs_migrated_subscription_status'][0])); $repair_status = false; } return $repair_status; }
/** * Check if a given item on a subscription can be switched. * * For an item to be switchable, switching must be enabled, and the item must be for a variable subscription or * part of a grouped product (at the time the check is made, not at the time the subscription was purchased) * * The subscription must also be active or on-hold and use manual renewals or use a payment method which supports cancellation. * * @param array $item An order item on the subscription * @param WC_Subscription $subscription An instance of WC_Subscription * @since 2.0 */ public static function can_item_be_switched($item, $subscription = null) { $product_id = wcs_get_canonical_product_id($item); if ('line_item' == $item['type'] && wcs_is_product_switchable_type($product_id)) { $is_product_switchable = true; } else { $is_product_switchable = false; } if ($subscription->has_status('active') && 0 !== $subscription->get_date('last_payment')) { $is_subscription_switchable = true; } else { $is_subscription_switchable = false; } if ($subscription->payment_method_supports('subscription_amount_changes') && $subscription->payment_method_supports('subscription_date_changes')) { $can_subscription_be_updated = true; } else { $can_subscription_be_updated = false; } if ($is_product_switchable && $is_subscription_switchable && $can_subscription_be_updated) { $item_can_be_switch = true; } else { $item_can_be_switch = false; } return apply_filters('woocommerce_subscriptions_can_item_be_switched', $item_can_be_switch, $item, $subscription); }
/** * Return an associative array of a given subscriptions details (if it exists) in the pre v2.0 data structure. * * @param WC_Subscription $subscription An instance of WC_Subscription * @return array Subscription details * @since 2.0 */ function wcs_get_subscription_in_deprecated_structure(WC_Subscription $subscription) { $completed_payments = array(); if ($subscription->get_completed_payment_count()) { if (!empty($subscription->order) && $subscription->order->has_status($subscription->get_paid_order_statuses())) { $completed_payments[] = $subscription->order->post->post_date_gmt; } $paid_renewal_order_ids = get_posts(array('posts_per_page' => -1, 'post_status' => $subscription->get_paid_order_statuses(), 'post_type' => 'shop_order', 'orderby' => 'date', 'order' => 'desc', 'fields' => 'ids', 'meta_query' => array(array('key' => '_subscription_renewal', 'compare' => '=', 'value' => $subscription->id, 'type' => 'numeric')))); foreach ($paid_renewal_order_ids as $paid_renewal_order_id) { $completed_payments[] = get_post_field('post_date_gmt', $paid_renewal_order_id); } } $items = $subscription->get_items(); $item = array_pop($items); if (!empty($item)) { $deprecated_subscription_object = array('order_id' => $subscription->order->id, 'product_id' => isset($item['product_id']) ? $item['product_id'] : 0, 'variation_id' => isset($item['variation_id']) ? $item['variation_id'] : 0, 'status' => $subscription->get_status(), 'period' => $subscription->billing_period, 'interval' => $subscription->billing_interval, 'length' => wcs_estimate_periods_between(0 == $subscription->get_time('trial_end') ? $subscription->get_time('start') : $subscription->get_time('trial_end'), $subscription->get_time('end') + 120, $subscription->billing_period, 'floor') / $subscription->billing_interval, 'start_date' => $subscription->get_date('start'), 'expiry_date' => $subscription->get_date('end'), 'end_date' => $subscription->has_status(wcs_get_subscription_ended_statuses()) ? $subscription->get_date('end') : 0, 'trial_expiry_date' => $subscription->get_date('trial_end'), 'failed_payments' => $subscription->failed_payment_count, 'completed_payments' => $completed_payments, 'suspension_count' => $subscription->suspension_count, 'last_payment_date' => $subscription->get_date('last_payment')); } else { $deprecated_subscription_object = array(); } return $deprecated_subscription_object; }