Índice
Introducción 1. Entender la estructura relacionada con los estados de pedido 2. Verificar los estados disponibles en tu tienda 3. Cambiar el estado de pedidos con SQL3.1. Actualizar el estado actual del pedido
3.2. Insertar el cambio en el historial
4. Casos más avanzados4.1 Cambiar el estado de pedidos creados antes de cierta fecha
4.2 Cambiar solo pedidos de un transportista
5. Comparativa de métodos 6. Validar el cambio de estado 7. Automatizar el cambio con PHP 8. Consideraciones adicionales ConclusiónIntroduccion
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.
- 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.
- 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_state | name |
1 | Pendiente |
2 | Pagado |
3 | Enviado |
6 | Cancelado |
- 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.
- 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;
- 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. |
- 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;
- 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.";
?>
- 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.