Skip to content

Commit 7e79332

Browse files
committed
Add logic for downgrades
1 parent e0a4c78 commit 7e79332

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

includes/class-wc-subscriptions-coupon.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,14 @@ public static function get_discount_amount_for_cart_item( $cart_item, $discount,
219219
}
220220
}
221221

222-
// Compute the sign-up fee. If it's a switch, we need to get the signup fee less
223-
// recurring payment upgrade/downgrade costs.
222+
// Compute the true sign-up fee. If it's a subscription upgrade, we need to get the fee
223+
// before extra charges, e.g. prorated recurring payment, were applied.
224224
if ( $is_switch ) {
225-
$sign_up_fee = (int) $cart_item['data']->get_meta( '_subscription_sign_up_fee_prorated' );
225+
$is_downgrade = isset( $cart_item['subscription_switch']['upgraded_or_downgraded'] ) &&
226+
'downgraded' === $cart_item['subscription_switch']['upgraded_or_downgraded'];
227+
$sign_up_fee = $is_downgrade ?
228+
WC_Subscriptions_Product::get_sign_up_fee( $cart_item['data'] ) :
229+
(int) $cart_item['data']->get_meta( '_subscription_sign_up_fee_prorated' );
226230
} else {
227231
$sign_up_fee = WC_Subscriptions_Product::get_sign_up_fee( $cart_item['data'] );
228232
}

tests/unit/test-class-wc-subscriptions-coupon.php

+20-2
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ public function test_get_discount_amount_for_cart_item_sign_up_fee_coupons() {
100100
'data' => $this->variable_subscription_product,
101101
'quantity' => 1,
102102
'subscription_switch' => [
103-
'subscription_id' => 123,
103+
'subscription_id' => 123,
104+
'upgraded_or_downgraded' => 'upgraded',
104105
],
105106
);
106107
$this->cart->empty_cart();
@@ -174,6 +175,22 @@ public function test_get_discount_amount_for_cart_item_sign_up_fee_coupons() {
174175
$coupon_sign_up_fee_large
175176
)
176177
);
178+
179+
// Subscription switch -- downgrade
180+
$cart_item['data']->update_meta_data( '_subscription_sign_up_fee', 10 );
181+
$cart_item['data']->update_meta_data( '_subscription_sign_up_fee_prorated', 0 );
182+
$cart_item['data']->update_meta_data( '_subscription_price_prorated', 0 );
183+
$cart_item['subscription_switch']['upgraded_or_downgraded'] = 'downgraded';
184+
$this->assertEquals(
185+
1,
186+
WC_Subscriptions_Coupon::get_discount_amount_for_cart_item(
187+
$cart_item,
188+
$discount,
189+
$discounting_amount,
190+
$single,
191+
$coupon_sign_up_fee_percent
192+
)
193+
);
177194
}
178195

179196

@@ -248,7 +265,8 @@ public function test_get_discount_amount_for_cart_item_recurring_fee_coupons() {
248265
'data' => $this->variable_subscription_product,
249266
'quantity' => 1,
250267
'subscription_switch' => [
251-
'subscription_id' => 123,
268+
'subscription_id' => 123,
269+
'upgraded_or_downgraded' => 'upgraded',
252270
],
253271
);
254272
$this->cart->empty_cart();

0 commit comments

Comments
 (0)