Su ejemplo no tiene en cuenta el valor de "use config".
Echemos un vistazo a cómo addInStockFilterToCollection
funciona:
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}
OK, está delegando a otro 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;
}
Esto une la tabla de inventario con las siguientes condiciones:
El producto no utiliza la configuración global Y tiene "administrar stock" establecido en "sí" Y está en stock
O
El producto no utiliza la configuración global Y tiene "administrar stock" establecido en "no"
O
- El producto usa la configuración global Y si la configuración global es "administrar stock = sí", está en stock
Debe invertir las condiciones de la siguiente manera:
El producto no utiliza la configuración global Y tiene "administrar stock" establecido en "sí" Y no está en stock
O
El producto utiliza la configuración global Y la configuración global es "administrar stock = sí" Y no está en stock
Explicación: Solo toma las condiciones en las que in_stock está realmente verificado y cambia la comparación a 0. Las condiciones en las que in_stock no está marcado ("administrar stock" = "no") significan que el producto siempre está en stock, independientemente del estado del stock , por lo que no los incluimos en nuestra consulta "agotado".
Entonces este es tu 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;
}