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.

  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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

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

Ir al contenido