Seu exemplo não leva em consideração o valor de "use config".
Vamos dar uma olhada em como addInStockFilterToCollection
funciona:
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}
OK, está delegando para outro método:
public function setInStockFilterToCollection($collection)
{
$manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
$cond = array(
'{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=1',
'{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
);
if ($manageStock) {
$cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=1';
} else {
$cond[] = '{{table}}.use_config_manage_stock = 1';
}
$collection->joinField(
'inventory_in_stock',
'cataloginventory/stock_item',
'is_in_stock',
'product_id=entity_id',
'(' . join(') OR (', $cond) . ')'
);
return $this;
}
Isso une a tabela de inventário às seguintes condições:
O produto não usa a configuração global E tem "gerenciar estoque" definido como "sim" E está em estoque
OU
O produto não usa a configuração global E "gerencia o estoque" definido como "não"
OU
- O produto usa a configuração global E se a configuração global for "gerenciar estoque = sim", estiver em estoque
Você precisa inverter as condições da seguinte maneira:
O produto não usa a configuração global E "gerencia o estoque" definido como "sim" E não está em estoque
OU
O produto usa a configuração global E a configuração global é "gerenciar estoque = sim" E não está em estoque
Explicação: Você pega apenas as condições em que in_stock está realmente marcado e altera a comparação para 0. As condições em que in_stock não está marcado ("gerenciar estoque" = "não") significa que o produto está sempre em estoque, independentemente do status do estoque , para não incluí-los em nossa consulta "fora de estoque".
Então este é o seu código:
public function setOutOfStockFilterToCollection($collection)
{
$manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
$cond = array(
'{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0'
);
if ($manageStock) {
$cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
}
$collection->joinField(
'inventory_in_stock',
'cataloginventory/stock_item',
'is_in_stock',
'product_id=entity_id',
'(' . join(') OR (', $cond) . ')'
);
return $this;
}