Automatic transitions for variables
This commit is contained in:
parent
68e23911ba
commit
be6f9d68bc
|
@ -1304,15 +1304,15 @@ class WC_Product extends WC_Abstract_Legacy_Product {
|
||||||
$this->set_backorders( 'no' );
|
$this->set_backorders( 'no' );
|
||||||
|
|
||||||
// If we are stock managing and we don't have stock, force out of stock status.
|
// If we are stock managing and we don't have stock, force out of stock status.
|
||||||
} elseif ( $this->get_stock_quantity() <= get_option( 'woocommerce_notify_no_stock_amount' ) && 'no' === $this->get_backorders() ) {
|
} elseif ( $this->get_stock_quantity() <= get_option( 'woocommerce_notify_no_stock_amount', 0 ) && 'no' === $this->get_backorders() ) {
|
||||||
$this->set_stock_status( 'outofstock' );
|
$this->set_stock_status( 'outofstock' );
|
||||||
|
|
||||||
// If we are stock managing, backorders are allowed, and we don't have stock, force on backorder status.
|
// If we are stock managing, backorders are allowed, and we don't have stock, force on backorder status.
|
||||||
} elseif ( $this->get_stock_quantity() <= 0 && 'no' !== $this->get_backorders() ) {
|
} elseif ( $this->get_stock_quantity() <= get_option( 'woocommerce_notify_no_stock_amount', 0 ) && 'no' !== $this->get_backorders() ) {
|
||||||
$this->set_stock_status( 'onbackorder' );
|
$this->set_stock_status( 'onbackorder' );
|
||||||
|
|
||||||
// If the stock level is changing and we do now have enough, force in stock status.
|
// If the stock level is changing and we do now have enough, force in stock status.
|
||||||
} elseif ( $this->get_stock_quantity() > get_option( 'woocommerce_notify_no_stock_amount' ) && array_key_exists( 'stock_quantity', $this->get_changes() ) ) {
|
} elseif ( $this->get_stock_quantity() > get_option( 'woocommerce_notify_no_stock_amount', 0 ) && array_key_exists( 'stock_quantity', $this->get_changes() ) ) {
|
||||||
$this->set_stock_status( 'instock' );
|
$this->set_stock_status( 'instock' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,19 +367,19 @@ class WC_Product_Variable extends WC_Product {
|
||||||
$this->set_backorders( 'no' );
|
$this->set_backorders( 'no' );
|
||||||
$this->set_stock_status( $this->child_is_in_stock() ? 'instock' : 'outofstock' );
|
$this->set_stock_status( $this->child_is_in_stock() ? 'instock' : 'outofstock' );
|
||||||
|
|
||||||
// If backorders are enabled, always in stock.
|
// If we are stock managing, backorders are allowed, and we don't have stock, force on backorder status.
|
||||||
} elseif ( 'no' !== $this->get_backorders() ) {
|
} elseif ( $this->get_stock_quantity() <= get_option( 'woocommerce_notify_no_stock_amount', 0 ) && 'no' !== $this->get_backorders() ) {
|
||||||
$this->set_stock_status( 'instock' );
|
$this->set_stock_status( 'onbackorder' );
|
||||||
|
|
||||||
// If we are stock managing and we don't have stock, force out of stock status.
|
// If we are stock managing and we don't have stock, force out of stock status.
|
||||||
} elseif ( $this->get_stock_quantity() <= get_option( 'woocommerce_notify_no_stock_amount' ) ) {
|
} elseif ( $this->get_stock_quantity() <= get_option( 'woocommerce_notify_no_stock_amount', 0 ) && 'no' === $this->get_backorders() ) {
|
||||||
$this->set_stock_status( 'outofstock' );
|
$this->set_stock_status( 'outofstock' );
|
||||||
|
|
||||||
// If the stock level is changing and we do now have enough, force in stock status.
|
// If the stock level is changing and we do now have enough, force in stock status.
|
||||||
} elseif ( $this->get_stock_quantity() > get_option( 'woocommerce_notify_no_stock_amount' ) && array_key_exists( 'stock_quantity', $this->get_changes() ) ) {
|
} elseif ( $this->get_stock_quantity() > get_option( 'woocommerce_notify_no_stock_amount', 0 ) && array_key_exists( 'stock_quantity', $this->get_changes() ) ) {
|
||||||
$this->set_stock_status( 'instock' );
|
$this->set_stock_status( 'instock' );
|
||||||
|
|
||||||
// Otherwise revert to status the children have.
|
// Otherwise revert to status the children have.
|
||||||
} else {
|
} else {
|
||||||
$this->set_stock_status( $this->child_is_in_stock() ? 'instock' : 'outofstock' );
|
$this->set_stock_status( $this->child_is_in_stock() ? 'instock' : 'outofstock' );
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,7 @@ class WC_Tests_Product_Data extends WC_Unit_Test_Case {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test the automatic stock status changing when products are managing stock.
|
* Test the automatic stock status transitions done on product save.
|
||||||
*
|
*
|
||||||
* @since 3.3.0
|
* @since 3.3.0
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -20,4 +20,55 @@ class WC_Tests_Product_Variable extends WC_Unit_Test_Case {
|
||||||
$this->assertArrayHasKey( 'price', $prices );
|
$this->assertArrayHasKey( 'price', $prices );
|
||||||
$this->assertTrue( $product_id > 0 );
|
$this->assertTrue( $product_id > 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the automatic stock status transitions done on variable product save.
|
||||||
|
*
|
||||||
|
* @since 3.3.0
|
||||||
|
*/
|
||||||
|
public function test_variable_product_auto_stock_status() {
|
||||||
|
$product = new WC_Product_Variable();
|
||||||
|
|
||||||
|
// Product should not have quantity and stock status should be based on children stock status if not managing stock.
|
||||||
|
$product->set_manage_stock( false );
|
||||||
|
$product->set_stock_quantity( 5 );
|
||||||
|
$product->set_stock_status( 'instock' );
|
||||||
|
$product->save();
|
||||||
|
$this->assertEquals( '', $product->get_stock_quantity() );
|
||||||
|
$this->assertEquals( 'outofstock', $product->get_stock_status() );
|
||||||
|
|
||||||
|
$product->set_manage_stock( true );
|
||||||
|
|
||||||
|
// Product should be out of stock if managing orders, no backorders allowed, and quantity too low.
|
||||||
|
$product->set_stock_quantity( 0 );
|
||||||
|
$product->set_stock_status( 'instock' );
|
||||||
|
$product->set_backorders( 'no' );
|
||||||
|
$product->save();
|
||||||
|
$this->assertEquals( 0, $product->get_stock_quantity() );
|
||||||
|
$this->assertEquals( 'outofstock', $product->get_stock_status() );
|
||||||
|
|
||||||
|
// Product should be on backorder if managing orders, backorders allowed, and quantity too low.
|
||||||
|
$product->set_stock_quantity( 0 );
|
||||||
|
$product->set_stock_status( 'instock' );
|
||||||
|
$product->set_backorders( 'yes' );
|
||||||
|
$product->save();
|
||||||
|
$this->assertEquals( 0, $product->get_stock_quantity() );
|
||||||
|
$this->assertEquals( 'onbackorder', $product->get_stock_status() );
|
||||||
|
|
||||||
|
// Product should go to in stock if backordered and inventory increases.
|
||||||
|
$product->set_stock_quantity( 5 );
|
||||||
|
$product->set_stock_status( 'onbackorder' );
|
||||||
|
$product->set_backorders( 'notify' );
|
||||||
|
$product->save();
|
||||||
|
$this->assertEquals( 5, $product->get_stock_quantity() );
|
||||||
|
$this->assertEquals( 'instock', $product->get_stock_status() );
|
||||||
|
|
||||||
|
// Product should go to in stock if out of stock and inventory increases.
|
||||||
|
$product->set_stock_quantity( 3 );
|
||||||
|
$product->set_stock_status( 'outofstock' );
|
||||||
|
$product->set_backorders( 'no' );
|
||||||
|
$product->save();
|
||||||
|
$this->assertEquals( 3, $product->get_stock_quantity() );
|
||||||
|
$this->assertEquals( 'instock', $product->get_stock_status() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue