PluginProbe
Subscriptions for WooCommerce with Stripe Recurring Payments / 2.3.0
Subscriptions for WooCommerce with Stripe Recurring Payments v2.3.0
2.4.0 2.3.0 2.2.0 2.1.0 2.0.0 1.11.2 1.11.1 1.11.0 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.6 1.9.5 trunk 1.3.0 1.3.1 1.3.2 1.4.0 All 65 releases
← All changes | includes/Illuminate/Helper.php +52 -8 1.11.2 → 2.3.0 View file →
@@ -1,5 +1,10 @@
1 1 <?php
2 +/**
3 + * Subscription helper utilities.
4 + *
5 + * @package SpringDevs\Subscription\Illuminate
6 + */
2 7
3 8 namespace SpringDevs\Subscription\Illuminate;
4 9
5 10 use SpringDevs\Subscription\Illuminate\Gateways\Stripe\Stripe;
@@ -68,8 +73,9 @@
68 73 'pending' => __( 'Pending', 'subscription' ),
69 74 'active' => __( 'Active', 'subscription' ),
70 75 'on-hold' => __( 'On Hold', 'subscription' ),
71 76 'expired' => __( 'Expired', 'subscription' ),
77 + 'completed' => __( 'Completed', 'subscription' ),
72 78 'pe_cancelled' => __( 'Pending Cancellation', 'subscription' ),
73 79 'cancelled' => __( 'Cancelled', 'subscription' ),
74 80 'draft' => __( 'Draft', 'subscription' ),
75 81 'trash' => __( 'Trash', 'subscription' ),
@@ -83,8 +89,22 @@
83 89 return isset( $statuses[ $status ] ) ? $statuses[ $status ] : '';
84 90 }
85 91
86 92 /**
93 + * Whether a subscription in this status still has a payment ahead.
94 + *
95 + * Cancelling or expiring keeps `_subscrpt_next_date` (the cancellation sweep
96 + * and reactivation read it), so views check the status before showing it.
97 + *
98 + * @param string $status Status.
99 + *
100 + * @return bool
101 + */
102 + public static function has_next_payment( $status ) {
103 + return ! in_array( $status, array( 'cancelled', 'expired' ), true );
104 + }
105 +
106 + /**
87 107 * Generate start date
88 108 *
89 109 * @param null|string $trial Trial.
90 110 *
@@ -514,9 +534,10 @@
514 534 'post_title' => "Subscription #{$subscription_id}",
515 535 )
516 536 );
517 537 // Check if this is a split payment subscription
518 - $payment_type = $product->get_meta( '_subscrpt_payment_type' ) ?: 'recurring';
538 + $payment_type = $product->get_meta( '_subscrpt_payment_type' );
539 + $payment_type = $payment_type ? $payment_type : 'recurring';
519 540 $max_payments = $product->get_meta( '_subscrpt_max_no_payment' );
520 541
521 542 $comment_content = '';
522 543 $activity_type = '';
@@ -979,10 +1000,13 @@
979 1000 foreach ( $cart_items as $key => $cart_item ) {
980 1001 $product = $cart_item['data'];
981 1002 if ( $product->is_type( 'simple' ) && isset( $cart_item['subscription'] ) ) {
982 1003 $cart_subscription = $cart_item['subscription'];
983 - $type = ucfirst( $cart_subscription['type'] );
984 - $price_data = self::build_cart_recurring_price_data( $cart_item, $key, $type );
1004 + // Cadence word must respect the frequency (plan items store the raw
1005 + // plural interval, e.g. "months"): singular for 1, plural + count above.
1006 + $sub_time = max( 1, (int) ( $cart_subscription['time'] ?? 1 ) );
1007 + $type = ( 1 === $sub_time ? '' : $sub_time . ' ' ) . ucfirst( self::get_typos( $sub_time, $cart_subscription['type'] ) );
1008 + $price_data = self::build_cart_recurring_price_data( $cart_item, $key, $type );
985 1009
986 1010 $recurrs[ $key ] = array_merge(
987 1011 $price_data,
988 1012 array(
@@ -988,10 +1012,15 @@
988 1012 array(
989 1013 'trial_status' => ! is_null( $cart_subscription['trial'] ),
990 1014 'start_date' => self::start_date( $cart_subscription['trial'] ),
991 1015 'next_date' => self::next_date( ( $cart_subscription['time'] ?? 1 ) . ' ' . $cart_subscription['type'], $cart_subscription['trial'] ),
992 - 'can_user_cancel' => $cart_item['data']->get_meta( '_subscrpt_user_cancel' ),
993 - 'max_no_payment' => $cart_item['data']->get_meta( '_subscrpt_max_no_payment' ),
1016 + 'can_user_cancel' => self::can_user_cancel( $cart_item['data']->get_meta( '_subscrpt_user_cancel' ) ) ? 'yes' : 'no',
1017 + 'max_no_payment' => ! empty( $cart_item['subscrpt_max_no_payment'] )
1018 + ? (int) $cart_item['subscrpt_max_no_payment']
1019 + : $cart_item['data']->get_meta( '_subscrpt_max_no_payment' ),
1020 + // Exact plan total for split items (the entered price the split is
1021 + // divided from); null for classic split items which have no plan total.
1022 + 'split_total' => isset( $cart_item['subscrpt_split_total'] ) ? (float) $cart_item['subscrpt_split_total'] : null,
994 1023 'quantity' => (int) $cart_item['quantity'],
995 1024 )
996 1025 );
997 1026 }
@@ -1364,9 +1393,9 @@
1364 1393
1365 1394 $comment_id = wp_insert_comment(
1366 1395 array(
1367 1396 'comment_author' => 'Subscription for WooCommerce',
1368 - 'comment_content' => sprintf( 'Subscription Renewal order successfully created. order is %s', $new_order_id ),
1397 + 'comment_content' => sprintf( 'Subscription Renewal order successfully created. Order #%s', $new_order_id ),
1369 1398 'comment_post_ID' => $subscription_id,
1370 1399 'comment_type' => 'order_note',
1371 1400 )
1372 1401 );
@@ -1374,8 +1403,22 @@
1374 1403 update_comment_meta( $comment_id, '_subscrpt_activity_type', 'renewal_order' );
1375 1404 }
1376 1405
1377 1406 /**
1407 + * Whether a stored `_subscrpt_user_cancel` value lets the customer cancel.
1408 + *
1409 + * Only an explicit "no" forbids it. An empty value means the option was never
1410 + * saved - plan-connected products never store it - and the product form shows
1411 + * "Yes" for that case, so the answer here has to be yes too.
1412 + *
1413 + * @param mixed $value Stored meta value.
1414 + * @return bool
1415 + */
1416 + public static function can_user_cancel( $value ): bool {
1417 + return 'no' !== $value;
1418 + }
1419 +
1420 + /**
1378 1421 * Get a subscription data.
1379 1422 *
1380 1423 * @param int $subscription_id Subscription ID.
1381 1424 * @return array|null
@@ -1404,9 +1447,9 @@
1404 1447
1405 1448 $order_id = get_post_meta( $subscription_id, '_subscrpt_order_id', true );
1406 1449 $order_item_id = get_post_meta( $subscription_id, '_subscrpt_order_item_id', true );
1407 1450
1408 - $can_user_cancel = in_array( get_post_meta( $subscription_id, '_subscrpt_user_cancel', true ), array( 1, '1', 'true', 'yes' ), true );
1451 + $can_user_cancel = self::can_user_cancel( get_post_meta( $subscription_id, '_subscrpt_user_cancel', true ) );
1409 1452
1410 1453 $start_datetime = (int) get_post_meta( $subscription_id, '_subscrpt_start_date', true );
1411 1454 $start_date = ! empty( $start_datetime ) ? gmdate( DATE_RFC2822, $start_datetime ) : null;
1412 1455
@@ -1465,9 +1508,10 @@
1465 1508 );
1466 1509 }
1467 1510
1468 1511 if (
1469 - ! in_array( strtolower( $status ), array( 'cancelled', 'pending' ), true )
1512 + ! in_array( strtolower( $status ), array( 'cancelled', 'pending', 'completed' ), true )
1513 + && ! empty( $next_date )
1470 1514 && $next_datetime - time() <= 0
1471 1515 && (int) $default_grace_period > 0
1472 1516 ) {
1473 1517 $subscription_data['grace_period'] = array(