Ejemplo n.º 1
0
/**
 * 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);
}
 /**
  * Make sure the sign-up fee on a subscription line item takes into account sign-up fees paid for switching.
  *
  * @param WC_Subscription $subscription
  * @return array $cart_item Details of an item in WC_Cart for a switch
  * @since 2.0
  */
 public static function subscription_items_sign_up_fee($sign_up_fee, $line_item, $subscription)
 {
     // This item has never been switched, no need to add anything
     if (!isset($line_item['switched_subscription_item_id'])) {
         return $sign_up_fee;
     }
     // First add any sign-up fees for previously switched items
     $switched_line_items = $subscription->get_items('line_item_switched');
     foreach ($switched_line_items as $switched_line_item_id => $switched_line_item) {
         if ($line_item['switched_subscription_item_id'] == $switched_line_item_id) {
             $sign_up_fee += $subscription->get_items_sign_up_fee($switched_line_item);
             // Recursion: get the sign up fee for this item's old item and the sign up fee for that item's old item and the sign up fee for that item's old item and the sign up fee for that item's old item ...
             break;
             // Each item can only be switched once
         }
     }
     // Now add any sign-up fees paid in switch orders
     foreach (wcs_get_switch_orders_for_subscription($subscription->id) as $order) {
         foreach ($order->get_items() as $order_item_id => $order_item) {
             if (wcs_get_canonical_product_id($line_item) == wcs_get_canonical_product_id($order_item)) {
                 // We only want to add the amount of the line total which was for a prorated sign-up fee, not the amount for a prorated recurring amount
                 if (isset($order_item['switched_subscription_sign_up_fee_prorated'])) {
                     if ($order_item['switched_subscription_sign_up_fee_prorated'] > 0) {
                         $sign_up_proportion = $order_item['switched_subscription_sign_up_fee_prorated'] / ($order_item['switched_subscription_price_prorated'] + $order_item['switched_subscription_sign_up_fee_prorated']);
                     } else {
                         $sign_up_proportion = 0;
                     }
                 } else {
                     $sign_up_proportion = 1;
                 }
                 $sign_up_fee += round($order_item['line_total'] * $sign_up_proportion, 2);
             }
         }
     }
     return $sign_up_fee;
 }
Ejemplo n.º 3
0
/**
 * 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;
}
 /**
  * Handles subscriptions put on hold; does the same thing as for
  * cancelled subscriptions; keep as separate implementations though.
  * 
  * @param WC_Subscription $subscription
  * @since 1.9.0
  */
 private static function subscription_status_on_hold($subscription)
 {
     if (!empty($subscription->order)) {
         $order_id = $subscription->order->id;
     } else {
         $order_id = $subscription->id;
     }
     $user_id = $subscription->user_id;
     $items = $subscription->get_items();
     foreach ($items as $item) {
         $product_id = $item['product_id'];
         $groups_product_groups = get_user_meta($user_id, '_groups_product_groups', true);
         if (isset($groups_product_groups[$order_id]) && isset($groups_product_groups[$order_id][$product_id]) && isset($groups_product_groups[$order_id][$product_id]['groups'])) {
             foreach ($groups_product_groups[$order_id][$product_id]['groups'] as $group_id) {
                 self::maybe_delete($user_id, $group_id, $order_id);
             }
         }
     }
 }
 /**
  * Make sure the sign-up fee on a subscription line item takes into account sign-up fees paid for switching.
  *
  * @param WC_Subscription $subscription
  * @param string $tax_inclusive_or_exclusive Defaults to the value tax setting stored on the subscription.
  * @return array $cart_item Details of an item in WC_Cart for a switch
  * @since 2.0
  */
 public static function subscription_items_sign_up_fee($sign_up_fee, $line_item, $subscription, $tax_inclusive_or_exclusive = '')
 {
     // This item has never been switched, no need to add anything
     if (!isset($line_item['switched_subscription_item_id'])) {
         return $sign_up_fee;
     }
     // First add any sign-up fees for previously switched items
     $switched_line_items = $subscription->get_items('line_item_switched');
     // Default tax inclusive or exclusive to the value set on the subscription. This is for backwards compatibility
     if (empty($tax_inclusive_or_exclusive)) {
         $tax_inclusive_or_exclusive = 'yes' == $subscription->prices_include_tax ? 'inclusive_of_tax' : 'exclusive_of_tax';
     }
     foreach ($switched_line_items as $switched_line_item_id => $switched_line_item) {
         if ($line_item['switched_subscription_item_id'] == $switched_line_item_id) {
             $sign_up_fee += $subscription->get_items_sign_up_fee($switched_line_item, $tax_inclusive_or_exclusive);
             // Recursion: get the sign up fee for this item's old item and the sign up fee for that item's old item and the sign up fee for that item's old item and the sign up fee for that item's old item ...
             break;
             // Each item can only be switched once
         }
     }
     // Now add any sign-up fees paid in switch orders
     foreach (wcs_get_switch_orders_for_subscription($subscription->id) as $order) {
         foreach ($order->get_items() as $order_item_id => $order_item) {
             if (wcs_get_canonical_product_id($line_item) == wcs_get_canonical_product_id($order_item)) {
                 // We only want to add the amount of the line total which was for a prorated sign-up fee, not the amount for a prorated recurring amount
                 if (isset($order_item['switched_subscription_sign_up_fee_prorated'])) {
                     if ($order_item['switched_subscription_sign_up_fee_prorated'] > 0) {
                         $sign_up_proportion = $order_item['switched_subscription_sign_up_fee_prorated'] / ($order_item['switched_subscription_price_prorated'] + $order_item['switched_subscription_sign_up_fee_prorated']);
                     } else {
                         $sign_up_proportion = 0;
                     }
                 } else {
                     $sign_up_proportion = 1;
                 }
                 $order_total = $order_item['line_total'];
                 if ('inclusive_of_tax' == $tax_inclusive_or_exclusive && 'yes' == $order->prices_include_tax) {
                     $order_total += $order_item['line_tax'];
                 }
                 $sign_up_fee += round($order_total * $sign_up_proportion, 2);
             }
         }
     }
     return $sign_up_fee;
 }
 /**
  * Validate the incoming request to either remove an item or add and item back to a subscription that was previously removed.
  * Add an descriptive notice to the page whether or not the request was validated or not.
  *
  * @since 2.0
  * @param WC_Subscription $subscription
  * @param int $order_item_id
  * @param bool $undo_request bool
  * @return bool
  */
 private static function validate_remove_items_request($subscription, $order_item_id, $undo_request = false)
 {
     $subscription_items = $subscription->get_items();
     $response = false;
     if (!wp_verify_nonce($_GET['_wpnonce'], $_GET['subscription_id'])) {
         wc_add_notice(__('Security error. Please contact us if you need assistance.', 'woocommerce-subscriptions'), 'error');
     } elseif (!current_user_can('edit_shop_subscription_line_items', $subscription->id)) {
         wc_add_notice(__('You cannot modify a subscription that does not belong to you.', 'woocommerce-subscriptions'), 'error');
     } elseif (!$undo_request && !isset($subscription_items[$order_item_id])) {
         // only need to validate the order item id when removing
         wc_add_notice(__('You cannot remove an item that does not exist. ', 'woocommerce-subscriptions'), 'error');
     } elseif (!$subscription->payment_method_supports('subscription_amount_changes')) {
         wc_add_notice(__('The item was not removed because this Subscription\'s payment method does not support removing an item.', 'woocommerce-subscriptions'));
     } else {
         $response = true;
     }
     return $response;
 }