Comencemos pensando en el SQL, no en Magento (llegaremos allí más adelante). Lo escribiría como tal (ignorando las zonas horarias por simplicidad):
SELECT sku,SUM(qty_ordered) FROM sales_flat_order_item
WHERE created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()
GROUP BY sku
Esa consulta funciona (probé). Entonces, ¿cómo haríamos para escribir esta consulta en Magento?
- En primer lugar, vemos que está completamente basado en
sales_flat_order_item
: Magento tiene una colección especial de recursos para esta tabla; podemos hacer uso de eso.
- Vemos que usa un
SUM
en una de las columnas
WHERE
tiene una BETWEEN
cláusula: probablemente podamos usarla Zend_Db_Expr
para generar nuestro marco de tiempo de 2 semanas.
- Finalmente, tiene un
GROUP
Veamos si no podemos armarlo, entonces, con una llamada rápida reset
para asegurarnos de que solo obtengamos las columnas que definimos, y nada más:
$query = Mage::getResourceModel('sales/order_item_collection');
$query->getSelect()->reset(Zend_Db_Select::COLUMNS)
->columns(array('sku','SUM(row_total)'))
->where(new Zend_Db_Expr('created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()'))
->group(array('sku'));
Un simple eco de $query->getSelect()
nos muestra que la consulta está formateada bastante bien:
SELECT `main_table`.`sku`, SUM(qty_ordered) FROM `sales_flat_order_item` AS `main_table` WHERE (created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()) GROUP BY `sku`
Otras Consideraciones:
En el futuro, es posible que desee filtrar este informe en función del estado del pedido (unirse a otra tabla) o puede asegurarse de que las zonas horarias sean precisas (en este momento está informando en base a GMT).
Unirse es simple:
->join(array('e' => 'sales_flat_order'),'main_table.order_id = e.entity_id')
Pero agregar zonas horarias puede ser complicado. Busque Mage_Core_Model_Date
algunos métodos que conviertan las marcas de tiempo hacia y desde GMT. También mire la colección de informes de ventas.
¡Espero que ayude! La mejor de las suertes.