Jump to content

Erreur sur le stock pour les déclinaisons


Recommended Posts

Bonjour,

 

PS: 1er post sur PS ;-)

 

Ma conf: Prestashop 1.5.6.1 (avec thème écostore + module vente privée)  / UNIX / APACHE / PHP 5.3 / MYSQL 5.1.49

 

Mon Cas:

J'utilise les déclinaisons assez basiquement: un pull en plusieurs tailles (trois par exemple: S, M, L) avec initialement un stock identique de chaque (disons 2 de chaque).

Je toppe la déclinaison la plus générale comme étant celle par défaut (disons L).

 

Mon soucis:

Le soucis est que dès qu'il n'y a plus de taille 'L' et qu'il reste des autres tailles, le produit est considéré en rupture de stock et il n'est plus possible d'en acheter.

 

Mes recherches:

Sur le forum, ce bug est clairement identifié depuis 2011; je n'ose même pas imaginé qu'il n'ait pas été corrigé depuis...

 

Mes pistes:

en base de données, il me semble que la table "ps_stock_available" est toute à fait opportune pour rapatrier le nombre total de produit toutes déclinaisons confondues.

 

Coté programme, dans les contrôleurs, on trouve le Manufacturer.php avec ligne 289 un pavé intéressant:

/* Return only the number of products */
if ($get_total)
{
	$sql = '
	SELECT p.`id_product`
	FROM `'._DB_PREFIX_.'product` p
	'.Shop::addSqlAssociation('product', 'p').'
	WHERE p.id_manufacturer = '.(int)$id_manufacturer
	.($active ? ' AND product_shop.`active` = 1' : '').'
	'.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
	AND p.`id_product` IN (
		SELECT cp.`id_product`
		FROM `'._DB_PREFIX_.'category_group` cg
		LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)'.
		($active_category ? ' INNER JOIN `'._DB_PREFIX_.'category` ca ON cp.`id_category` = ca.`id_category` AND ca.`active` = 1' : '').'
		WHERE cg.`id_group` '.$sql_groups.'
	)';
	$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
	return (int)count($result);}

--> Mes questions:

 

Ce bug a il été corrigé ?

  --> Si oui, je veux bien le programme ou le bout de code corrigé

 --> Sinon:

                 - que faut-il modifier: manufacturer.php ? un autre ? les deux ?

                 - quelles fonctions modifiées pour ne pas avoir de régressions ?

 

Par avance, Merci,

Onejock.

 

 

 

Link to comment
Share on other sites

la requête qui commence ligne 607:

$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, MAX(product_attribute_shop.id_product_attribute) id_product_attribute, product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity, pl.`description`, pl.`description_short`, pl.`available_now`,pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, MAX(image_shop.`id_image`) id_image,il.`legend`, m.`name` AS manufacturer_name, cl.`name` AS category_default,DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(),INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).'DAY)) > 0 AS new, product_shop.price AS order price
FROM `'._DB_PREFIX_.'category_product` cp
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product`)
'.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1').'
'.Product::sqlStock('p', 'product_attribute_shop', false, $context->shop).'
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.
Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image`
AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer`
WHERE product_shop.`id_shop` = '.(int)$context->shop->id.'
AND cp.`id_category` = '.(int)$this->id
.($active ? ' AND product_shop.`active` = 1' : '')
.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
.($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '')
.' GROUP BY product_shop.id_product';

avec en particulier:

Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1')

Link to comment
Share on other sites

en fait, il ne faut pas modifier cette requête, elle est utilisée de partout; de plus pour les cas il n'y a plus de produits toutes déclinaisons confondues, elle est pratique.

 

en fait, il faut en créer une seconde que renvoi uniquement le nom de produits toutes déclinaisons confondues et y faire appel puis tester les deux valeurs pour décider s'il faut afficher ou non le panier...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...