Magento: recorriendo los pedidos entre fechas

Magento logoDe gracias recibisteis, dad de gracia.. Compartir es vivir dicen otros.. Es habitual en el mundo del desarrollo del software que se compartan los conocimientos. Los pinitos personales de cada uno en el día a día. Esas cosas que tanto nos han costado alcanzar, tras búsquedas y búsquedas leyendo a compañeros del desarrollo y al final reuniendo toda la información acabas construyendo la solución que necesitas.

No os comparto código del trabajo, ya que seguro que no es tan interesante como este ejemplo general de aquí abajo. Para que construyas el script que necesitas 😉

Creo que nunca dejaré de aprender los entresijo de Magento. Ahora estoy recorriendo los pedidos para obtener informes. Esto está probado sobre un Magento 1.9, no debería de haber muchas diferencias con otras versiones.

AMPLIADO EN ESTE OTRO POST

El código

Igual en el anterior post recorriendo los productos, es bien sencillo el recorrer los pedidos.  A partir de aquí podremos recopilar toda la información que necesitemos ya que dentro del objeto PEDIDO tendremos los productos, facturas, cliente asociado (o sus datos si es que ha sido una venta sin registro), y un largo etcétera.

De este tipo de consultas, lo más complejo es el filtras los datos entre fechas. Aunque tampoco lo es mucho. Marco en negrita cómo hacer un filtrado entre fechas, de la misma forma lo podremos hacer para filtrar productos creados entre fechas, clientes dados de alta entre ciertas fechas, etcétera.

<?php
// cargamos el autoloader de Magento
require_once __DIR__.'/app/Mage.php';

Mage::app(); // inicializo el objeto Magento que a veces es necesario

$nline = "\n";
$cont = 0;

// filtro fechas desde hace 30 días hasta ayer sin incluir últimas 24 horas
$startDate = Mage::getModel('core/date')->gmtDate(null, time() - 86400 * 30);
$endDate = Mage::getModel('core/date')->gmtDate(null, time() - 86400);
echo 'Searching sale orders between start: '.$startDate.' and end: '.$endDate.$nline;

// aquí es donde realmente se hace la consulta a la base de datos
$orderModel = Mage::getModel('sales/order');
$ordersCollection = $orderModel->getCollection()
    ->addFieldToFilter('created_at', array('gteq' => $startDate))
    ->addFieldToFilter('created_at', array('lteq' => $endDate))
    ->addAttributeToSort('created_at', 'desc');

// se muestra la información por patalla
echo 'Sale orders found: '.count($ordersCollection).$nline;
echo 'id,code,payment_method,status,created_at,update_at,grand_total,total_products'.$nline;
foreach ($ordersCollection as $order) {
    $paymentMethod = $order->getPayment()->getMethodInstance()->getCode();

    echo $order->getId().', ';
    echo $order->getIncrementId().', ';
    echo $paymentMethod.', ';
    echo $order->getStatus().', ';
    echo $order->getCreatedAt().', ';
    echo $order->getUpdatedAt().', ';
    echo $order->getGrandTotal().', ';
    echo count($order->getAllItems());
    echo $nline;

    ++$cont;
}

echo 'Total sale orders found: '.$cont.$nline;

Este código lo podemos poner en un fichero .php y ejecutarlo desde línea de comandos o se puede incluir como parte de una extensión. Ahora si queremos guardar los resultados en un ficheros CSV no tenemos más que ejecutarlo en el servidor usando una instrucción como la siguiente:

$ php get_orders.php > orders_30days.csv

Recorriendo los productos del pedido

Si ahora quisiéramos recorrer los productos de dicho pedido, podemos hacer algo parecido a lo siguiente modificando el bucle principal y metiendo dentro otro:

foreach ($ordersCollection as $order) {
    $paymentMethod = $order->getPayment()->getMethodInstance()->getCode();

    echo $order->getId().', ';
    echo $order->getIncrementId().', ';
    echo $paymentMethod.', ';
    echo $order->getStatus().', ';
    echo $order->getCreatedAt().', ';
    echo $order->getUpdatedAt().', ';
    echo $order->getGrandTotal().', ';
    $products = $order->getAllItems();
    echo count($products).', ';
    echo $nline;

    foreach ($products as $product) {
        echo $product->getSku() . ', '.$product->getName().$nline;
    }

    ++$cont;
}

Esto añade un segundo recorrido mostrando después de cada pedido el SKU y NAME de cada producto de los pedidos.

Cancelando pedidos

Imaginemos ahora que queremos cancelar todos los pedidos, podríamos añadir al código anterior un par de instrucciones:

$order->cancel();
$order->save();

¿Sencillo verdad?

Recuperando el cliente

Imaginemos que ahora, además de los productos queremos los datos del cliente que ha comprado cada pedido:

foreach ($ordersCollection as $order) {
    $paymentMethod = $order->getPayment()->getMethodInstance()->getCode();

    echo $order->getId().', ';
    echo $order->getIncrementId().', ';
    echo $paymentMethod.', ';
    echo $order->getStatus().', ';
    echo $order->getCreatedAt().', ';
    echo $order->getUpdatedAt().', ';
    echo $order->getGrandTotal().', ';
    $products = $order->getAllItems();
    echo count($products);
    echo $nline;

    foreach ($products as $product) {
        echo '    '.$product->getSku().', '.$product->getName().$nline;
    }

    $customer = Mage::getModel('customer/customer')->load($order->getCustomerId());
    echo '    '.$customer->getName().', '.$customer->getEmail().$nline;

    ++$cont;
}

Así poco a poco, y con pocas líneas de código fuente, podemos añadir más información útil para trabajarla después.

La salida por pantalla

Debería de ser algo parecido a:

12115, P00032281, banktransfer, pendtrans, 2016-06-20 18:21:46, 2016-06-20 18:21:47, 123.0000, 1
    SKU1, Nombre de producto1
    Nombre Apellido1, email@cliente.com
12114, P00032280, redsys, pending_payment, 2016-06-20 17:55:30, 2016-06-20 17:55:32, 456.0000, 1
    SKU2, Nombre de producto2
    Nombre Apellido2, email2@cliente.com

Terminando

A título personal, he probado otras soluciones e-commerce. Ahora que estoy probando Magento, viendo hasta dónde puede llegar a nivel de código fuente.. todo hay que decirlo, es muy potente, flexible, y personalizable. No voy a hacer una comparativa rápida pero sí que debo decir que desde el punto de vista del programador es brillante. Le daría un “me gusta” xD

Espero que sirva.

Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *