Te ayudamos a crear la tienda online de tu negocio y vender por internet.

Cómo cambiar la numeración de las facturas en Prestashop

Volvemos a escribir este artículo porque la información que hemos encontrado por internet en distintos foros (incluido el de Prestashop) no nos aclaraba cómo poder cambiar la numeración de las facturas en tu tienda online Prestashop.
Este proceso es necesario para el cambio de ejercicio anual. Necesitamos que nuestras facturas empiecen desde la 001 en cada año nuevo que entra.

Para realizar este cambio en la numeración de las facturas en Prestashop existen dos maneras, veámoslas.

SOLUCIÓN FACIL

Prestashop por defecto permite cambiar tanto el prefijo de la factura como la numeración. Esto lo podemos realizar desde nuestro panel de administración en: Pedidos –> Facturas.
Hay veremos que tenemos estas 2 opciones. A la hora de cambiar el prefijo no tendremos ningún problema pero cuando vayamos a cambiar la numeración y pongamos la 001, por ejemplo, no nos dejará. Dirá que la última factura es la #567, por ejemplo y no nos permitirá realizar el cambio.

cambiar-la-numeracion-de las-facturas-en Prestashop-crear-tienda-online-estudio-diseno-web-madrid (2)

Esto se debe a que para generar las facturas con nuestra tienda online Prestashop se va a la tabla donde se encuentran las facturas y le pide que le de el número más alto de factura. Una vez lo recoge le suma uno y lo aplica en la nueva factura. Por lo tanto, desde la administración no nos deja añadir una numeración menor a la de la última factura generada.
– ¿Cómo solucionarlo sin tener que tocar en base de datos y código?
Muy sencillo. Para solucionarlo tendremos que poner en la numeración de nuestras facturas el año y número de factura: YYYYNNN, es decir 2017001. De esta manera la factura que nos generará será #FACT2017001, #FACT2017002, #FACT2017003

cambiar-la-numeracion-de las-facturas-en Prestashop-crear-tienda-online-estudio-diseno-web-madrid (1)

Así no tendremos problemas puesto que para el siguiente ejercicio tendremos que cambiar la numeración a 2018001 y este número siempre será mayor que los anteriores.

SOLUCIÓN MAS COMPLICADA

Si por el contrario alguien tiene numeraciones más complejas o prefijos que lleven el año y no puedan ir en las numeraciones (#FAC2017-001), obligatoriamente tendremos que poner la numeración de la factura a 001.
Desde la administración no nos dejará cambiarlo. Podremos cambiarlo en base de datos y la primera factura que genere la creará con el 001, pero la siguiente ya volverá a su proceso normal de preguntar a la base de datos cuál es la numeración más alta y nos volverá a poner la factura 567 (por ejemplo).

Para ello vamos a hacer 2 cosas: Añadir una línea de código en la Clase Order de Prestashop y comentar el contenido de uno de los métodos de la Clase AdminInvoicesControllerCore. Vamos a ello:

– Cambio en el código de la Clase Order:

Tenemos que abrir el archivo /classes/order/Order.php a través del FTP con un editor. Buscaremos la función setLastInvoiceNumber, que se encuentra en la línea 1148 aproximadamente (esto puede variar según la versión de Prestashop).

public static function setLastInvoiceNumber($order_invoice_id, $id_shop)
	{
		if (!$order_invoice_id)
			return false;

		
		$number = Configuration::get('PS_INVOICE_START_NUMBER', null, null, $id_shop);
		$newNumber = $number + 1; //--> Añadimos esta Línea
		// If invoice start number has been set, you clean the value of this configuration
		if ($number)
			Configuration::updateValue('PS_INVOICE_START_NUMBER', $newNumber, false, null, $id_shop); //--> Pasamos cómo segundo parámetro la variable que hemos creado cambiándolo por el parámetro false que había anteriormente

		
		$sql = 'UPDATE `'._DB_PREFIX_.'order_invoice` SET number =';

		if ($number)
			$sql .= (int)$number;
		else
			$sql .= '(SELECT new_number FROM (SELECT (MAX(`number`) + 1) AS new_number
			FROM `'._DB_PREFIX_.'order_invoice`) AS result)';

		$sql .= ' WHERE `id_order_invoice` = '.(int)$order_invoice_id;

		return Db::getInstance()->execute($sql);
	}

Como podemos ver en el ejemplo, añadimos la línea 8 y modificamos la línea 11 como se indica en los comentarios que se pueden ver.

Con esto estamos diciendoloe a Prestashop que vuelva a actualizar el registro PS_INVOICE_START_NUMBER con la última facturas + 1. De esta manera forzamos a Prestashop a que siempre que haya un registro distinto de NULL en ese campo de la base de datos lo recoja como siguiente para la numeración. Dicho campo lo utilizaremos como contador de la factura puesto que siempre se estará actualizando.
Por defecto Prestashop, si no hicieramos esto, actualizaría.

– Cambio en el código de la Clase AdminInvoicesControllerCore:

Ahora tenemos que decirle a Prestashop que no consulte desde la administración el último número de factura para que podamos guardar la numeración que queramos, que en este caso será menor a la última que tenemos en base de datos. De no hacer el siguiente cambio, no nos permitirá guardar desde la administración dándonos el siguiente error: “Número de factura no válido” y además nos indicará cual es el último que tiene en base de datos.

Para que podamos guardar, debemos hacer los siguiente:
Tenemos que abrir el archivo /controllers/admin/AdminInvoicesController.php a través del FTP con un editor. Aquí buscaremos la función beforeUpdateOptions y comentaremos su contenido como en el ejemplo:

public function beforeUpdateOptions()
    {
        /* if ((int)Tools::getValue('PS_INVOICE_START_NUMBER') != 0 && (int)Tools::getValue('PS_INVOICE_START_NUMBER') <= Order::getLastInvoiceNumber()) {
            $this->errors[] = $this->l('Invalid invoice number.').Order::getLastInvoiceNumber().')';
        } */
    }

Una vez realizados estos cambios ya podremos generar numeraciones complejas con prefijos seguidos del número que queramos.

Si necesitáis ayuda para crear una tienda online o necesitas soporte con este tema o cualquier otro de Prestashop, no dudéis contactar con nosotros. Somos un estudio de diseño y desarrollo web especializado en tiendas virtuales y ventas por internet.

Diseñador gráfico y web en DD Lineal.
No Comments

Post a Comment