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 +55 -9 1.11.1 → 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;
@@ -59,15 +64,18 @@
59 64 * Get verbose status from status slug.
60 65 *
61 66 * @param string $status Status.
62 67 * @param bool $return_all Whether to return all statuses or a single status.
68 + *
69 + * @return string|array Verbose status label, or the full status map when $return_all is true.
63 70 */
64 - public static function get_verbose_status( $status, $return_all = false ): string|array {
71 + public static function get_verbose_status( $status, $return_all = false ) {
65 72 $statuses = array(
66 73 'pending' => __( 'Pending', 'subscription' ),
67 74 'active' => __( 'Active', 'subscription' ),
68 75 'on-hold' => __( 'On Hold', 'subscription' ),
69 76 'expired' => __( 'Expired', 'subscription' ),
77 + 'completed' => __( 'Completed', 'subscription' ),
70 78 'pe_cancelled' => __( 'Pending Cancellation', 'subscription' ),
71 79 'cancelled' => __( 'Cancelled', 'subscription' ),
72 80 'draft' => __( 'Draft', 'subscription' ),
73 81 'trash' => __( 'Trash', 'subscription' ),
@@ -81,8 +89,22 @@
81 89 return isset( $statuses[ $status ] ) ? $statuses[ $status ] : '';
82 90 }
83 91
84 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 + /**
85 107 * Generate start date
86 108 *
87 109 * @param null|string $trial Trial.
88 110 *
@@ -512,9 +534,10 @@
512 534 'post_title' => "Subscription #{$subscription_id}",
513 535 )
514 536 );
515 537 // Check if this is a split payment subscription
516 - $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';
517 540 $max_payments = $product->get_meta( '_subscrpt_max_no_payment' );
518 541
519 542 $comment_content = '';
520 543 $activity_type = '';
@@ -977,10 +1000,13 @@
977 1000 foreach ( $cart_items as $key => $cart_item ) {
978 1001 $product = $cart_item['data'];
979 1002 if ( $product->is_type( 'simple' ) && isset( $cart_item['subscription'] ) ) {
980 1003 $cart_subscription = $cart_item['subscription'];
981 - $type = ucfirst( $cart_subscription['type'] );
982 - $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 );
983 1009
984 1010 $recurrs[ $key ] = array_merge(
985 1011 $price_data,
986 1012 array(
@@ -986,10 +1012,15 @@
986 1012 array(
987 1013 'trial_status' => ! is_null( $cart_subscription['trial'] ),
988 1014 'start_date' => self::start_date( $cart_subscription['trial'] ),
989 1015 'next_date' => self::next_date( ( $cart_subscription['time'] ?? 1 ) . ' ' . $cart_subscription['type'], $cart_subscription['trial'] ),
990 - 'can_user_cancel' => $cart_item['data']->get_meta( '_subscrpt_user_cancel' ),
991 - '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,
992 1023 'quantity' => (int) $cart_item['quantity'],
993 1024 )
994 1025 );
995 1026 }
@@ -1362,9 +1393,9 @@
1362 1393
1363 1394 $comment_id = wp_insert_comment(
1364 1395 array(
1365 1396 'comment_author' => 'Subscription for WooCommerce',
1366 - '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 ),
1367 1398 'comment_post_ID' => $subscription_id,
1368 1399 'comment_type' => 'order_note',
1369 1400 )
1370 1401 );
@@ -1372,8 +1403,22 @@
1372 1403 update_comment_meta( $comment_id, '_subscrpt_activity_type', 'renewal_order' );
1373 1404 }
1374 1405
1375 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 + /**
1376 1421 * Get a subscription data.
1377 1422 *
1378 1423 * @param int $subscription_id Subscription ID.
1379 1424 * @return array|null
@@ -1402,9 +1447,9 @@
1402 1447
1403 1448 $order_id = get_post_meta( $subscription_id, '_subscrpt_order_id', true );
1404 1449 $order_item_id = get_post_meta( $subscription_id, '_subscrpt_order_item_id', true );
1405 1450
1406 - $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 ) );
1407 1452
1408 1453 $start_datetime = (int) get_post_meta( $subscription_id, '_subscrpt_start_date', true );
1409 1454 $start_date = ! empty( $start_datetime ) ? gmdate( DATE_RFC2822, $start_datetime ) : null;
1410 1455
@@ -1463,9 +1508,10 @@
1463 1508 );
1464 1509 }
1465 1510
1466 1511 if (
1467 - ! in_array( strtolower( $status ), array( 'cancelled', 'pending' ), true )
1512 + ! in_array( strtolower( $status ), array( 'cancelled', 'pending', 'completed' ), true )
1513 + && ! empty( $next_date )
1468 1514 && $next_datetime - time() <= 0
1469 1515 && (int) $default_grace_period > 0
1470 1516 ) {
1471 1517 $subscription_data['grace_period'] = array(