Merge pull request #25943 from woocommerce/fix/25810
Fixed remainder application for percent coupons
This commit is contained in:
commit
23e555823b
|
@ -549,10 +549,7 @@ class WC_Discounts {
|
||||||
foreach ( $items_to_apply as $item ) {
|
foreach ( $items_to_apply as $item ) {
|
||||||
for ( $i = 0; $i < $item->quantity; $i ++ ) {
|
for ( $i = 0; $i < $item->quantity; $i ++ ) {
|
||||||
// Find out how much price is available to discount for the item.
|
// Find out how much price is available to discount for the item.
|
||||||
$discounted_price = $this->get_discounted_price_in_cents( $item );
|
$price_to_discount = $this->get_discounted_price_in_cents( $item );
|
||||||
|
|
||||||
// Get the price we actually want to discount, based on settings.
|
|
||||||
$price_to_discount = ( 'yes' === get_option( 'woocommerce_calc_discounts_sequentially', 'no' ) ) ? $discounted_price : $item->price;
|
|
||||||
|
|
||||||
// Run coupon calculations.
|
// Run coupon calculations.
|
||||||
$discount = min( $price_to_discount, 1 );
|
$discount = min( $price_to_discount, 1 );
|
||||||
|
|
|
@ -223,6 +223,44 @@ class WC_Tests_Coupon extends WC_Unit_Test_Case {
|
||||||
$this->assertEquals( 29.5, WC()->cart->total );
|
$this->assertEquals( 29.5, WC()->cart->total );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that the remainder is handled correctly and does not turn the total negative.
|
||||||
|
*
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public function test_percent_discount_handles_remainder_correctly() {
|
||||||
|
|
||||||
|
// Create product.
|
||||||
|
$product = WC_Helper_Product::create_simple_product();
|
||||||
|
$product->set_regular_price( 18 );
|
||||||
|
$product->save();
|
||||||
|
|
||||||
|
// Create coupon.
|
||||||
|
$coupon = WC_Helper_Coupon::create_coupon( '20off' );
|
||||||
|
update_post_meta( $coupon->get_id(), 'discount_type', 'percent' );
|
||||||
|
update_post_meta( $coupon->get_id(), 'coupon_amount', '20' );
|
||||||
|
$coupon_2 = WC_Helper_Coupon::create_coupon( '100off' );
|
||||||
|
update_post_meta( $coupon_2->get_id(), 'discount_type', 'percent' );
|
||||||
|
update_post_meta( $coupon_2->get_id(), 'coupon_amount', '100' );
|
||||||
|
|
||||||
|
// Create a flat rate method.
|
||||||
|
WC_Helper_Shipping::create_simple_flat_rate();
|
||||||
|
|
||||||
|
// Add product to cart.
|
||||||
|
WC()->cart->add_to_cart( $product->get_id(), 4 );
|
||||||
|
|
||||||
|
// Add coupon.
|
||||||
|
WC()->cart->add_discount( $coupon->get_code() );
|
||||||
|
WC()->cart->add_discount( $coupon_2->get_code() );
|
||||||
|
|
||||||
|
// Set the flat_rate shipping method.
|
||||||
|
WC()->session->set( 'chosen_shipping_methods', array( 'flat_rate' ) );
|
||||||
|
WC()->cart->calculate_totals();
|
||||||
|
|
||||||
|
// Test if the cart total amount is equal 29.5.
|
||||||
|
$this->assertEquals( 10, WC()->cart->total );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test date setters/getters.
|
* Test date setters/getters.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue