Error «order creation failed» / «creación de pedido fallida» en Prestashop 1.3.1, 1.3.7 y 1.4.16

For non spanish readers, the short version:

The problem is related to your MySQL version. It fails with 5.1.x and 5.5.x versions.
Prestashop 1.3.1 : add the lines:

$order->invoice_date = '0000-00-00 00:00:00';
$order->delivery_date = '0000-00-00 00:00:00';

just before the order creation ($order->add()) in your «damaged» payment module.
Prestashop 1.4.x : modify your ps_orders table structure:

alter table ps_orders modify reference varchar(14) null;

Prestashop 1.3.7 : Presumably the error is one of both, or related with null values in that table.

Y la historia larga en castellano:

Después de varios días buscando una solución a este error y de no encontrar nada concluyente en la web, por fin he dado con ello.

El error en cuestión ocurría al intentar realizar un pago contrarreembolso (módulo cashondelivery) y también al intentar realizarlo por transferencia bancaria (módulo bankwire). El pago a través de PayPal funcionaba correctamente (por suerte).

El problema empezó a ocurrir después de realizar una migración de servidor de una máquina más antigua a una máquina más nueva.

Inicialmente pensé que el problema era una incompatibilidad entre el PHP instalado en mi nuevo servidor y el código de mi versión de Prestashop por lo que decidí actualizar la tienda a la última versión. Comprobé que el error se seguía dando en las versiones 1.3 7 y también en la 1.4.16.

Un post en http://www.prestashop.com/forums/viewthread/29422/third_party_modules/solved_order_creation_failed_with_every_payment_module_help_1_dot_2_dot_4/ me puso sobre la pista de que el problema estaba en la base de datos o en el conector a la base de datos. Después de trazar las consultas en la base de datos vi que en la versión 1.4.16 la consulta que se intentaba ejecutar :

INSERT INTO `ps_orders` (`id_address_delivery`,`id_address_invoice`,`id_c
art`,`id_currency`,`id_lang`,`id_customer`,`id_carrier`,`secure_key`,`payment`,`
module`,`conversion_rate`,`recyclable`,`gift`,`gift_message`,`shipping_number`,`
total_discounts`,`total_paid`,`total_paid_real`,`total_products`,`total_products
_wt`,`total_shipping`,`carrier_tax_rate`,`total_wrapping`,`invoice_number`,`deli
very_number`,`invoice_date`,`delivery_date`,`valid`,`date_add`,`date_upd`) VALUE
S ('15','15','690','1','3','3','15','8ebb6bdaaabe8e9daa8f15d774042747','Cash on
delivery (COD)','maofree_cashondeliveryfee','1','0','0','BLA:10','','0','91.67',
'91.67','81.67','81.67','10','0','0','0','0','0000-00-00 00:00:00','0000-00-00 0
0:00:00','0','2011-03-18 20:02:32','2011-03-18 20:02:32');

tiraba el error :

ERROR 1364 (HY000): Field 'reference' doesn't have a default value

Lo cual nos llevaba directamente a la causa del problema: en versiones anteriores de la base de datos o del conector, mysql gestionaba los nulls y/o cadenas vacías de manera diferente. Lo solucioné modificando la estructura de la base de datos permitiendo que el valor de ese campo por defecto fuese null:

alter table ps_orders modify reference varchar(14) null;

En la versión 1.3.1 el error en la consulta no venía de este campo sino de los campos invoice_date y delivery_date, a los que no se les asigna un valor por defecto. En este caso la solución podría haber sido la misma, pero preferí modificar el código PHP del módulo cashondelivery añadiendo las líneas :

$order->invoice_date = '0000-00-00 00:00:00';
$order->delivery_date = '0000-00-00 00:00:00';

en el fichero principal del módulo, en la parte en la que se crea la orden, justo antes de la instrucción $order->add() que la añade a la base de datos.

He de decir que inicialmente intenté esta misma solución por código para el caso de la versión 1.4, pero ninguna de las líneas

$order->reference = "null";
$order->reference = "";

añadidas en el sitio adecuado surtió el efecto deseado y el error persistió.

Este error está relacionado con la utilización de MySQL 5.5.x y por los reportes de error que he leído en algunos posts, también con MySQL 5.1.x.

No investigué el error exacto en Prestashop 1.3.7, pero presumiblemente es alguno de estos 2, o está relacionado con valores null en esta tabla.

Share this post

Related post

  1. Daniel 2011.10.14 6:21pm

    Tengo un modulo de bbva para pago con visa de prestashop versión 1.4.3 me hace los pagos correctamente pero me devuelve al front office de prestashop con un mensaje de error de pago y no me registra el pedido ni me vacia el carrito, podria tener algo que ver este post con mi problema? Gracias contestar a mi e-mail.

  2. Juanfer 2011.10.15 12:23pm

    Hola. No tengo experiencia con ese módulo ni con la versión de Prestashop que indicas, por lo que no te puedo ayudar, sin embargo es perfectamente posible que el módulo no sea compatible con la versión de Prestashop que tienes. Lo primero que debes hacer es ver los requisitos de versión del módulo. En cualquier caso, la mejor persona a la que realizar cualquier pregunta sobre un módulo particular es al propio autor o autores del módulo.
    Un saludo y buena suerte!.

  3. Roberto Tavares 2016.05.04 7:09pm

    Muchas gracias Juan!!
    Lo solucione haciendo la modificación: «alter table ps_orders modify reference varchar(14) null;»

    Estuve cerca de 4 horas buscando el error que causaba que los pedidos no se crearan con el modulo de bankwire tras actualizar de la version 1.2.5 a la 1.4.9 de prestashop, y tras revisar cada uno de los módulos, sabia que el problema estaba a la hora de la asignación ($result=$order->add()); pero no daba con el valor nulo de reference… Muchas gracias, me has quitado el dolor de cabeza

    Saludos desde México!!

  4. Juanfer 2016.05.04 8:00pm

    Me alegro de haberte ayudado! Saludos.

  5. raul 2021.11.23 9:35am

    Hace tiempo ya de este hilo, pero me ha ocurrido el error hace unos dias y me has resuelto la vida
    gracias!

  6. Juanfer 2021.12.16 12:09am

    Curioso que a pesar del tiempo te haya servido. Me alegro, pero quizá debas considerar utilizar versiones de Prestashop más modernas, que seguro que las hay 😀 (hace mucho que no trasteo PS)

{ Piensa / Think }

"This is a waste of life. [...] the entire educational system in the modern day is nothing more than a cookie cutter processing plant that prepares humans for mostly predefined occupational roles. This element of human life has become so traditionally ingrained, that many falsely consider the nature of ‘having a job’ some form of human instinct. Even parents will ask their kids “What do you want to be when you grow up?” as though there was only one thing. This is disturbing and a violation of human potential." - The Zeitgeist Movement


"He aprendido que hay cosas que pueden ser comprendidas pero que nunca podrán ser explicadas con palabras sin desvirtuar su grandeza" - Andrés Pascual


"You never change things by fighting the existing reality. To change something, build a new model that makes the existing model obsolete." - Buckminster Fuller


"... I am the master of my fate. I am the captain of my soul." - William Ernest Henley