Bug MAJ stock des lots [SOLUTION]

Bonjour,

Je viens de passer plusieurs jours sur un bug et je voulais partager ma solution.

Ce bug a déjà été évoqué à plusieurs reprises sur d’anciennes versions mais, à ma connaissance et après de nombreuses recherches, la solution suivante n’a jamais été évoquée telle quelle.

Bug constaté sur les versions : 7.0.0 et 7.0.3 (à mon avis les 7.0.1 et 7.0.2 sont impactées également et probablement les anciennes versions).

J’ai constaté ce bug lorsque l’on utilise le module de gestion des numéros et lots et numéros de série. La mise à jour des stocks d’un lot n’est pas bonne lors d’une sortie de stock (expédition client par exemple). Les totaux sont corrects mais la table llx_product_batch n’est pas mise à jour.

Voir

stock.jpg.

Les mouvements du numéros de lots sont correctement insérés, le total du stock est correctement mis à jour mais le total du stock du lot n’est pas mis à jour. Ici il devrait être à 4 au lieu de 5.

Le bug intervient en raison d’un problème avec la syntaxe MYSQL utilisée, ce bug apparaît à priori si le STRICT MODE est activé sur MYSQL ce qui est le cas chez mon hébergeur.

En effet, la requête suivante n’affecte aucune ligne sur mon serveur MYSQL :

sql=UPDATE llx_product_batch SET fk_product_stock=1, sellby=null, eatby='2018-07-21 00:00:00', batch='1', qty=4, import_key=null WHERE rowid=1 AND tms=''

Le bug vient de tms=''

En effet tms est un timestamp qui dans mon cas a la valeur NULL dans la base de donnée.

La valeur NULL est différente de « chaine de caractère vide », le serveur Mysql ne met donc pas à jour la ligne.

A noter que la requête suivante ne fonctionnera pas non plus :

sql=UPDATE llx_product_batch SET fk_product_stock=1, sellby=null, eatby='2018-07-21 00:00:00', batch='1', qty=4, import_key=null WHERE rowid=1 AND tms=null

Il faut que le test sur NULL soit explicite :

sql=UPDATE llx_product_batch SET fk_product_stock=1, sellby=null, eatby='2018-07-21 00:00:00', batch='1', qty=4, import_key=null WHERE rowid=1 AND tms IS NULL

Pour corriger le problème j’ai implémenté la solution suivante dans le fichier « htdocs/product/class/productbatch.class.php ».

Remplacer la ligne 219 $sql.= " WHERE rowid=".$this->id." AND tms='".$this->db->idate($this->tms)."'";

par $sql.= " WHERE rowid=".$this->id;

Puis ajouter :

if ($this->db->idate($this->tms) == '')
		{
			$sql.= " AND tms IS NULL";
		}
		else
		{
			$sql.= " AND tms='".$this->db->idate($this->tms)."'";
		}
2 « J'aime »

Bonjour
Merci pour ce retour. Pouvez vous expliquer tout ça sur le github qui est le lieu de rassemblement pour les dev
@+

Ok, je mets ça sur le github.

Bonne journée.

Merci pour cet insights, ça fonctionne ! Nota : ce bug arrive encore, pour ma part hébergement par OVH
Merci