When loading all the allowed products attached to a configurable product the following code is called:
/**
* Get Allowed Products
*
* @return array
*/
public function getAllowProducts()
{
if (!$this->hasAllowProducts()) {
$products = array();
$skipSaleableCheck = Mage::helper('catalog/product')->getSkipSaleableCheck();
$allProducts = $this->getProduct()->getTypeInstance(true)
->getUsedProducts(null, $this->getProduct());
foreach ($allProducts as $product) {
if ($product->isSaleable() || $skipSaleableCheck) {
$products[] = $product;
}
}
$this->setAllowProducts($products);
}
return $this->getData('allow_products');
}
The key that you are looking for is the line if ($product->isSaleable() || $skipSaleableCheck) {
this will only allow the addition of saleable products unless overridden.
One option for you is to listen to the event catalog_product_is_salable_after
and override the value of is_salable
, note that there is a typo in Magento not my regarding saleable.