Estos últimos días me han pedido sacar informes de un Magento. Ha sido muy interesante porque no me esperaba tener esta información en el CMS, pero sí, ahí estaba.
Resulta que Magento viene con un atributo de coste de los productos, que es de sistema. Dicho atributo de producto tiene el código cost. Además, en la información que se guarda en cada pedido tenemos el precio original, este coste del sistema en el momento de la venta, y más información. Con esto podremos saber el margen de beneficio que hubo en el momento de la venta.
Es importante notar que supongo que ya usas el atributo de coste del sistema, o que tienes un ERP enganchado a Magento que te lo está manteniendo actualizado con cada pedido de compra.
Al grano, filtrando entre fechas
Primero que todo vamos a filtrar entre fechas los pedidos recibiendo por parámetros estas fechas así:
php script.php añoDesde mesDesde díaDesde añoHasta mesHasta díaHasta
..esto lo hacemos así:
<?php require_once __DIR__.'/app/Mage.php'; Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); // PARAMETERS /////////////////////////////////////////////////// if ($argc < 7) { errorParameters(); } $yearFrom = $argv[1]; $monthFrom = $argv[2]; $dayFrom = $argv[3]; $yearTo = $argv[4]; $monthTo = $argv[5]; $dayTo = $argv[6]; echo 'Year from = '.$yearFrom.PHP_EOL .'month from = '.$monthFrom.PHP_EOL .'day from = '.$dayFrom.PHP_EOL .'year to = '.$yearTo.PHP_EOL .'month to = '.$monthTo.PHP_EOL .'day to = '.$dayTo.PHP_EOL; function errorParameters() { echo 'ERROR: Parameters, use:'.PHP_EOL .' $ get_report_exports.php <yearFrom> <monthFrom> <dayFrom> <yearTo> <monthTo> <dayTo>'.PHP_EOL; exit; } // END PARAMETERS ///////////////////////////////////////////////////
Viendo las fechas límite
Para ver las fechas que recibimos le añadimos lo siguiente:
echo 'Fecha de Magento: '.Mage::getModel('core/date')->gmtDate().PHP_EOL; $startDate = new DateTime($yearFrom.'-'.$monthFrom.'-'.$dayFrom.' 00:00:00'); echo 'Fecha desde: '.$startDate->format('Y-m-d H:i:s').PHP_EOL; $endDate = new DateTime($yearTo.'-'.$monthTo.'-'.$dayTo.' 23:59:59'); echo 'Fecha hasta: '.$endDate->format('Y-m-d H:i:s').PHP_EOL;
Recogiendo los pedidos de la base de datos
Ahora atacamos la BD y tendremos la colección de pedidos:
$orderModel = Mage::getModel('sales/order'); $ordersCollection = $orderModel->getCollection() ->addFieldToFilter('created_at', array( 'from' => $startDate->format('Y-m-d H:i:s'), 'to' => $endDate->format('Y-m-d H:i:s'), )) ->addFieldToFilter('status', ['complete', 'recogido']) ->addAttributeToSort('created_at', 'desc');
Listando la información
Ya sólo nos queda recorrer la colección de pedidos y mostrar dicha información por pantalla:
foreach ($ordersCollection as $order) { foreach ($order->getAllItems() as $orderItemKey => $orderItem) { if ($orderItem->getBaseCost()) { $marginBenefits = $orderItem->getBasePrice() - $orderItem->getBaseCost(); } else { $marginBenefits = 'NO COST'; } echo $order->getCreatedAt().',' .$order->getIncrementId().',' .$orderItem->getSku().',"' .$orderItem->getName().'",' .$orderItem->getBaseCost().',' .$orderItem->getBasePrice().',' .$orderItem->getQtyOrdered().',' .$marginBenefits .PHP_EOL; } }
Fíjate que el base_cost y el base_price del producto son sin impuestos. También hay otro datos que te pueden interesar, si quieres listarlos todos hazle un var_dump($orderItem) y los verás todos.
Terminando
Todos estos códigos los puedes poner en un fichero de PHP y llamarlo redirigiendo la salida por pantalla a un fichero CSV. Así luego puedes abrirlos con LibreOffice por ejemplo, y trabajar los resultados.
php script.php 2018 1 1 2018 3 31 > script.csv
Espero que sirva.
Un saludo.
Muchas gracias por este artículo. Muchas gracias. Fantástico.
No hay de qué Lucy!
Saludos.