Introduccion
En PrestaShop, los informes nativos del back-office cumplen su función, pero cuando se requiere mayor personalización o integrar datos con otras herramientas, realizar informes directamente desde MySQL es una opción poderosa y flexible.
En este artículo aprenderás a crear un informe de ventas desde cero con consultas SQL. Cubriremos desde los conceptos básicos hasta ejemplos avanzados, incluyendo segmentación por fechas, productos, clientes, categorías y métodos de pago.
- Tablas relacionadas con ventas
Tabla | Descripción |
ps_orders | Contiene los pedidos realizados |
ps_order_detail | Líneas de productos vendidas por pedido |
ps_customer | Información de clientes |
ps_product | Datos de productos |
ps_order_invoice | Facturas generadas |
Consejo: Asegúrate de trabajar con pedidos en estado confirmado o pagado, no simplemente registrados.
2. Informe básico de ventas por fecha
SELECT DATE(o.date_add) AS fecha, COUNT(o.id_order) AS total_pedidos, SUM(o.total_paid_tax_incl) AS total_vendido FROM ps_orders o WHERE o.current_state IN (2, 5) -- pagado o entregado GROUP BY DATE(o.date_add) ORDER BY fecha DESC;
- Ventas por producto
SELECT od.product_id, od.product_name, SUM(od.product_quantity) AS cantidad_vendida, SUM(od.total_price_tax_incl) AS total_producto FROM ps_order_detail od JOIN ps_orders o ON o.id_order = od.id_order WHERE o.current_state IN (2, 5) GROUP BY od.product_id, od.product_name ORDER BY total_producto DESC LIMIT 10;
- Ventas por cliente
SELECT c.id_customer, CONCAT(c.firstname, ' ', c.lastname) AS cliente, COUNT(o.id_order) AS pedidos, SUM(o.total_paid_tax_incl) AS total_comprado FROM ps_customer c JOIN ps_orders o ON c.id_customer = o.id_customer WHERE o.current_state IN (2, 5) GROUP BY c.id_customer ORDER BY total_comprado DESC LIMIT 10;
- Ventas por categoría
SELECT cl.name AS categoria, SUM(od.product_quantity) AS cantidad, SUM(od.total_price_tax_incl) AS total FROM ps_order_detail od JOIN ps_product p ON od.product_id = p.id_product JOIN ps_category_product cp ON p.id_product = cp.id_product JOIN ps_category_lang cl ON cp.id_category = cl.id_category JOIN ps_orders o ON od.id_order = o.id_order WHERE o.current_state IN (2, 5) AND cl.id_lang = 1 GROUP BY cl.name ORDER BY total DESC;
- Ventas por método de pago
SELECT payment, COUNT(id_order) AS cantidad_pedidos, SUM(total_paid_tax_incl) AS total_pago FROM ps_orders WHERE current_state IN (2, 5) GROUP BY payment;
- Comparativa de métodos
Enfoque | Ventajas | Desventajas |
SQL directo | Rápido, personalizable, exportable | Requiere acceso técnico |
Módulo externo | Interfaz gráfica, soporte técnico | Coste adicional |
Back-office | Integrado, seguro | Poco flexible, lento |
- Exportar informe a CSV desde PHP
<?php
require(dirname(__FILE__).’/config/config.inc.php’);
require(dirname(__FILE__).’/init.php’);
$sql = «SELECT DATE(date_add) AS fecha, COUNT(id_order) AS pedidos, SUM(total_paid_tax_incl) AS total FROM ps_orders WHERE current_state IN (2, 5) GROUP BY fecha ORDER BY fecha DESC»;
$result = Db::getInstance()->executeS($sql);
header(‘Content-Type: text/csv’);
header(‘Content-Disposition: attachment;filename=»informe_ventas.csv»‘);
$output = fopen(‘php://output’, ‘w’);
fputcsv($output, array(‘Fecha’, ‘Pedidos’, ‘Total’));
foreach ($result as $row) {
fputcsv($output, $row);
}
fclose($output);
exit;
?>
Conclusión
Crear informes de ventas personalizados con MySQL permite acceder a información estratégica de forma rápida, precisa y sin depender de herramientas externas. Al dominar las tablas clave de PrestaShop, puedes segmentar los datos según tus necesidades: por producto, cliente, categoría, fecha o método de pago.
Este enfoque es ideal para desarrolladores, agencias o gestores de eCommerce que necesitan reportes a medida o integraciones con BI externos.