Introduccion

PrestaShop gestiona los estados de pedido mediante una arquitectura basada en eventos y tablas interrelacionadas. Cambiar el estado de un pedido desde el panel de administración es sencillo, pero hacerlo de forma masiva puede ser muy ineficiente. En este artículo veremos cómo actualizar el estado de múltiples pedidos directamente desde MySQL, cuidando la integridad de los datos y considerando las implicaciones funcionales.

  1. Entender la estructura relacionada con los estados de pedido

PrestaShop utiliza varias tablas para registrar y gestionar los estados de los pedidos. Las principales son:

Tabla

Propósito

ps_orders

Contiene el pedido y su estado actual (current_state).

ps_order_history

Guarda el historial de cambios de estado de cada pedido.

ps_order_state

Define los estados posibles (ej. Pagado, Enviado, Cancelado).

ps_order_state_lang

Traducciones y nombres visibles de cada estado.

El campo current_state en ps_orders refleja el estado actual, pero el historial debe mantenerse actualizado para que PrestaShop funcione correctamente.

  1. Verificar los estados disponibles en tu tienda

Para ver los estados activos:

SELECT id_order_state, name FROM ps_order_state_lang WHERE id_lang = 1;

Asegúrate de usar el id_lang correspondiente a tu idioma principal.

Ejemplo de resultados:

id_order_statename
1Pendiente
2Pagado
3Enviado
6Cancelado
  1. Cambiar el estado de pedidos con SQL

Caso: Cambiar pedidos con estado actual 1 (Pendiente) a 2 (Pagado)

3.1. Actualizar el estado actual del pedido

UPDATE ps_orders
SET current_state = 2
WHERE current_state = 1;

3.2. Insertar el cambio en el historial

Es importante reflejar este cambio también en la tabla ps_order_history.

INSERT INTO ps_order_history (id_employee, id_order, id_order_state, date_add)
SELECT 1, id_order, 2, NOW()
FROM ps_orders
WHERE current_state = 2 AND id_order NOT IN (
    SELECT id_order FROM ps_order_history WHERE id_order_state = 2
);

  • id_employee: puedes usar 1 (admin) o el ID de un empleado real si lo conoces.
  • Esta consulta evita duplicar entradas en el historial.
  1. Casos más avanzados

4.1 Cambiar el estado de pedidos creados antes de cierta fecha

UPDATE ps_orders
SET current_state = 3
WHERE date_add < '2023-01-01' AND current_state = 2;
INSERT INTO ps_order_history (id_employee, id_order, id_order_state, date_add)
SELECT 1, id_order, 3, NOW()
FROM ps_orders
WHERE current_state = 3 AND date_add < '2023-01-01';

4.2 Cambiar solo pedidos de un transportista

UPDATE ps_orders
SET current_state = 6
WHERE id_carrier = 5 AND current_state != 6;
INSERT INTO ps_order_history (id_employee, id_order, id_order_state, date_add)
SELECT 1, id_order, 6, NOW()
FROM ps_orders
WHERE current_state = 6 AND id_carrier = 5;

  1. Comparativa de métodos

Método

Pros

Contras

SQL directo

Rápido, flexible, ideal para muchos pedidos.

Requiere precisión, sin validaciones automáticas.

Módulo PrestaShop

Interfaz amigable, integración con notificación de cliente.

Más lento, menos escalable.

Cambios manuales

Control total por pedido.

Ineficiente para grandes volúmenes.

  1. Validar el cambio de estado

Puedes comprobar el resultado con:

SELECT id_order, current_state FROM ps_orders WHERE current_state = 2;
Y revisar el historial asociado:
SELECT * FROM ps_order_history WHERE id_order_state = 2 ORDER BY date_add DESC;
  1. Automatizar el cambio con PHP

Puedes usar un script para lanzar el cambio desde el backend:

<?php
require(dirname(__FILE__).'/config/config.inc.php');
$sql1 = 'UPDATE ps_orders SET current_state = 3 WHERE current_state = 2';
Db::getInstance()->execute($sql1);
$sql2 = 'INSERT INTO ps_order_history (id_employee, id_order, id_order_state, date_add)
SELECT 1, id_order, 3, NOW()
FROM ps_orders WHERE current_state = 3';
Db::getInstance()->execute($sql2);
echo "Estado de pedidos actualizado.";
?>
  1. Consideraciones adicionales
  • Notificaciones al cliente: los cambios hechos por SQL no envían correos. Si necesitas notificar, deberías hacerlo desde el sistema o vía API.
  • Hooks: cambiar directamente en la base de datos no dispara eventos de PrestaShop. Si dependes de ellos (por ejemplo, para generar facturas), considera usar la clase OrderHistory en PHP.

Ejemplo con OrderHistory:

$order = new Order($id_order);

$history = new OrderHistory();

$history->id_order = $order->id;

$history->changeIdOrderState(3, $order->id);

$history->addWithemail(true);

Conclusión

Cambiar el estado de pedidos masivamente con SQL es una tarea potente que permite ahorrar tiempo, especialmente en tiendas con alto volumen de ventas. Siempre que se haga con precisión, y considerando la integridad del historial, puede ser una solución limpia y eficiente.

Aun así, si necesitas disparar acciones como envío de correos, generación de documentos o integraciones, es recomendable usar los métodos nativos de PrestaShop, combinando SQL para selección y PHP para ejecución.

Una buena estrategia suele ser identificar con SQL, validar, y ejecutar el cambio con scripts controlados. Es un equilibrio entre rendimiento y robustez.

Ir al contenido