De 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.
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.