He recibido una consulta sobre cómo sacar el ciclo de ventas de Magento. Ya respondí, pero los cálculos no me salen exactos. Así que jugando, jugando.. he tratado de encontrar cómo Magento calcula el ciclo de ventas que vemos en el panel de control.
Como no me daba exacto, he recorrido después las facturas, que tampoco me daba exacto. Y después añadí el recorrido de los abonos. Con y sin impuestos, tampoco me daba la misma cifra. Balanceando facturas con abonos, con y sin impuestos, que es lo correctamente contable tampoco me salía la misma cifra, aunque se iba acercando.. Conclusión, que en una tarde recorriendo los pedidos, facturas y abonos, no salen los mismos cálculos que te muestra Magento en el panel de control. Pero aquí dejo la información para el que le pueda servir 😉 de todas formas, contablemente, lo correcto son contabilizar las facturas y abonos.
Así que aquí dejo este pequeño HOWTO para recorrer los pedidos de Magento y así calcular el ciclo de ventas entre fechas. Como recorrer las facturas y los abonos también.
Al grano:
<?php require_once __DIR__.'/../web/app/Mage.php'; Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); echo 'Ciclo de ventas obtenido desde los informes de Magento: ' .Mage::getResourceModel('reports/order_collection')->calculateSales()->load()->getFirstItem()->getLifetime() .PHP_EOL; echo PHP_EOL; echo 'CICLO DE VENTAS OBTENIDO DE LOS PEDIDOS'.PHP_EOL; $orders = Mage::getModel('sales/order')->getCollection() ->addFieldToFilter('state', array('complete', 'closed')) ->addAttributeToSort('created_at', 'desc'); echo 'Encontrados '.count($orders).' pedidos completados.'.PHP_EOL; $grandTotal = 0; $grandTotalTaxExcluded = 0; foreach ($orders as $order) { if ($order->getState() == 'complete') { $grandTotal += $order->getGrandTotal(); $grandTotalTaxExcluded += $order->getGrandTotal() - $order->getTaxAmount(); } else { $grandTotal -= $order->getGrandTotal(); $grandTotalTaxExcluded -= $order->getGrandTotal() - $order->getTaxAmount(); } } echo 'Grand total: '.$grandTotal.PHP_EOL; echo 'Grand total sin impuestos: '.$grandTotalTaxExcluded.PHP_EOL; echo PHP_EOL; echo 'CICLO DE VENTAS OBTENIDO DE LAS FACTURAS Y ABONOS'.PHP_EOL; $invoices = Mage::getModel('sales/order_invoice')->getCollection(); $grandTotalInvoices = $grandTotalInvoicesTaxExcluded = 0; foreach ($invoices as $invoice) { $grandTotalInvoices += $invoice->getGrandTotal(); $grandTotalInvoicesTaxExcluded += $invoice->getGrandTotal() - $invoice->getTaxAmount(); } echo 'Total facturado: '.$grandTotalInvoices.PHP_EOL; echo 'Total facturado sin impuestos: '.$grandTotalInvoicesTaxExcluded.PHP_EOL; $creditmemos = Mage::getModel('sales/order_creditmemo')->getCollection(); $grandTotalCreditmemos = 0; foreach ($creditmemos as $creditmemo) { $grandTotalCreditmemos += $creditmemo->getGrandTotal(); $grandTotalCreditmemosTaxExcluded += $creditmemo->getGrandTotal() - $creditmemo->getTaxAmount(); } echo 'Total abonado: '.$grandTotalCreditmemos.PHP_EOL; echo 'Total abonado sin impuestos: '.$grandTotalCreditmemosTaxExcluded.PHP_EOL; echo 'Balance total de facturas y abonos: '.($grandTotalInvoices - $grandTotalCreditmemos).PHP_EOL; echo 'Balance total de facturas y abonos sin impuestos: '.($grandTotalInvoicesTaxExcluded - $grandTotalCreditmemosTaxExcluded).PHP_EOL;
El ciclo de ventas simplemente es lo facturado entre ciertas fechas. En Magento, el ciclo de ventas que se ve al entrar en el panel de control refleja el total ganado desde el origen de los tiempos. Es decir, te indica lo vendido en el total de todos los pedidos. Su cálculo es complejo, y aunque Magento no sea un programa contable tiene muchos datos relacionados con la contabilidad.
En mi caso, lo que me vengo encontrando es que se hacen exportaciones de estos datos desde Magento a otros programas dedicados a la contabilidad y declaración de impuestos. No podemos basarnos sólo en la información de los pedidos, o en la información de los informes de Magento para presentar los impuestos al estado. Así que toca exportar toda la facturación y abonos para tratarlos externamente.
Espero que sirva.
Saludos.