Jump to content

Le client n'est pas averti si il commande plus que le stock disponible


Recommended Posts

Bonjour à tous,

Je suis sur une version 1.6.1.17 de Prestashop.
J'ai activé la gestion de stock simple (sans afficher la valeur de stock que je ne souhaite pas divulguer).
Si un client achète plus d'article qu'il n'y en a en stock, l'étiquette "en stock" ne change pas sur la page produit, comme celle-ci n'est pas réactualisée pourquoi pas. Par contre sur la page panier c'est toujours indiqué "en stock".

J'aimerai savoir si c'est le comportement normal de Prestashop, où si c'est moi qui est trop bidouillé mon TPL.
Si ce n'est pas le comportement normal pouvez-vous m'indiquer une piste ?

Je vous remercie par avance,

Bonne journée,

Jeff
 

Link to comment
Share on other sites

Bonjour Eolia,

Merci pour votre prompt réponse 🙂, effectivement j'autorise le client à passer commande quand le produit est hors stock, mais faut il encore qu'il soit au courant. C'est là que le bas blesse.
J'utilise le thème de base de Prestashop, je n'ai pas trop bricolé les TPL concernés (shopping-cart.tpl et shopping-cart-product-line.tpl), je vais fouiller.

Merci encore.

Bien cordialement,
Jeff

Link to comment
Share on other sites

Du coup j'ai modifié shopping-cart-product-line.tpl

Pour indiquer à Prestashop qu'il mette dans la "page panier" l'étiquette "En cours de réapprovisionnement" si le client achète une quantité supérieur au stock.

Pour cela vers la ligne 37 du fichier shopping-cart-product-line.tpl  :

<td class="cart_avail" style = "visibility:hidden;"><span class="label{if $product.quantity_available <= 0 && isset($product.allow_oosp) && !$product.allow_oosp} label-danger{elseif $product.quantity_available <= 0} label-warning{else} label-success{/if}">{if $product.quantity_available <= 0}{if isset($product.allow_oosp) && $product.allow_oosp}{if isset($product.available_later) && $product.available_later}{$product.available_later}{else}{l s='In Stock'}{/if}{else}{l s='Out of stock'}{/if}{else}{if isset($product.available_now) && $product.available_now}{$product.available_now}{else}{l s='In Stock'}{/if}{/if}</span>{hook h="displayProductDeliveryTime" product=$product}</td>

J'ai changé les :

$product.quantity_available <= 0
(stock supérieur à zéro)

par
$product.cart_quantity > $product.quantity_available
(quantité commandée par le client supérieure au stock).

Cela fonctionne nickel !!! Merci Eolia !

Le dernier micro soucis c'est que depuis cette page panier le client peut encore changer la quantité, et la page ne se réactualise pas toute seule (à moins d'appuyer sur la touche F5).

Je ne maitrise pas du tout le JS j'imagine que le soucis vient de là. J'ai contrôlé via "l'inspecteur" de Chrome, il ne semble pas y avoir d'erreur JS. Le prix se met à jour mais pas l'étiquette de stock. Si quelqu'un a une idée ?

Bonne soirée,

++,

Jeff
 

 

Link to comment
Share on other sites

ca se passe dans product.js au niveau de cette fonction:

//update display of the availability of the product AND the prices of the product
function updateDisplay()
{
	var productPriceDisplay = productPrice;
	var productPriceWithoutReductionDisplay = productPriceWithoutReduction;

	if (!selectedCombination['unavailable'] && quantityAvailable > 0 && productAvailableForOrder == 1)
	{
		//show the choice of quantities
		$('#quantity_wanted_p:hidden').show('slow');

		//show the "add to cart" button ONLY if it was hidden
		$('#add_to_cart:hidden').fadeIn(600);

		//hide the hook out of stock
		$('#oosHook').hide();

		$('#availability_date').fadeOut();

		//availability value management
		if (stock_management && availableNowValue != '')
		{
			$('#availability_value').removeClass('label-warning').addClass('label-success').text(availableNowValue).show();
			$('#availability_statut:hidden').show('slow');
		}
		else
			$('#availability_statut:visible').hide('slow');

		//'last quantities' message management
		if (!allowBuyWhenOutOfStock)
		{
			if (quantityAvailable <= maxQuantityToAllowDisplayOfLastQuantityMessage)
				$('#last_quantities').show('slow');
			else
				$('#last_quantities').hide('slow');
		}

		if (quantitiesDisplayAllowed)
		{
			$('#pQuantityAvailable:hidden').show('slow');
			$('#quantityAvailable').text(quantityAvailable);

			if (quantityAvailable < 2) // we have 1 or less product in stock and need to show "item" instead of "items"
			{
				$('#quantityAvailableTxt').show();
				$('#quantityAvailableTxtMultiple').hide();
			}
			else
			{
				$('#quantityAvailableTxt').hide();
				$('#quantityAvailableTxtMultiple').show();
			}
		}
	}
	else
	{
		//show the hook out of stock
		if (productAvailableForOrder == 1)
		{
			$('#oosHook').show();
			if ($('#oosHook').length > 0 && function_exists('oosHookJsCode'))
				oosHookJsCode();
		}

		//hide 'last quantities' message if it was previously visible
		$('#last_quantities:visible').hide('slow');

		//hide the quantity of pieces if it was previously visible
		$('#pQuantityAvailable:visible').hide('slow');

		//hide the choice of quantities
		if (!allowBuyWhenOutOfStock)
			$('#quantity_wanted_p:visible').hide('slow');

		//display that the product is unavailable with theses attributes
		if (!selectedCombination['unavailable'])
		{
			$('#availability_value').text(doesntExistNoMore + (globalQuantity > 0 ? ' ' + doesntExistNoMoreBut : ''));
			if (!allowBuyWhenOutOfStock)
				$('#availability_value').removeClass('label-success').addClass('label-warning');
		}
		else
		{
			$('#availability_value').text(doesntExist).removeClass('label-success').addClass('label-warning');
			$('#oosHook').hide();
		}

		if ((stock_management == 1 && !allowBuyWhenOutOfStock) || (!stock_management && selectedCombination['unavailable']))
			$('#availability_statut:hidden').show();

		if (typeof(selectedCombination['available_date']) !== 'undefined' && typeof(selectedCombination['available_date']['date_formatted']) !== 'undefined' && selectedCombination['available_date']['date'].length != 0)
		{
			var available_date = selectedCombination['available_date']['date'];
			var tab_date = available_date.split('-');
			var time_available = new Date(tab_date[0], tab_date[1], tab_date[2]);
			time_available.setMonth(time_available.getMonth()-1);
			var now = new Date();
			if (now.getTime() < time_available.getTime() && $('#availability_date_value').text() != selectedCombination['available_date']['date_formatted'])
			{
				$('#availability_date').fadeOut('normal', function(){
					$('#availability_date_value').text(selectedCombination['available_date']['date_formatted']);
					$(this).fadeIn();
				});
			}
			else if (now.getTime() < time_available.getTime())
				$('#availability_date').fadeIn();
		}
		else
			$('#availability_date').fadeOut();

		//show the 'add to cart' button ONLY IF it's possible to buy when out of stock AND if it was previously invisible
		if (allowBuyWhenOutOfStock && !selectedCombination['unavailable'] && productAvailableForOrder)
		{
			$('#add_to_cart:hidden').fadeIn(600);

			if (stock_management && availableLaterValue != '')
			{
				$('#availability_value').addClass('label-warning').text(availableLaterValue).show('slow');
				$('#availability_statut:hidden').show('slow');
			}
			else
				$('#availability_statut:visible').hide('slow');
		}
		else
		{
			$('#add_to_cart:visible').fadeOut(600);
			if (stock_management == 1 && productAvailableForOrder)
				$('#availability_statut:hidden').show('slow');
		}

		if (productAvailableForOrder == 0)
			$('#availability_statut:visible').hide();
	}

 

Link to comment
Share on other sites

Merci pour votre réponse argumentée.

Là j'avoue je cale sur le JS. J'ai le sentiment que cela se joue ici :
 

//display that the product is unavailable with theses attributes
		if (!selectedCombination['unavailable'])
		{
			$('#availability_value').text(doesntExistNoMore + (globalQuantity > 0 ? ' ' + doesntExistNoMoreBut : ''));
			if (!allowBuyWhenOutOfStock)
				$('#availability_value').removeClass('label-success').addClass('label-warning');
		}
		else
		{
			$('#availability_value').text(doesntExist).removeClass('label-success').addClass('label-warning');
			$('#oosHook').hide();
		}

		if ((stock_management == 1 && !allowBuyWhenOutOfStock) || (!stock_management && selectedCombination['unavailable']))
			$('#availability_statut:hidden').show();


et qu'il faudrait que je change le "globalQuantity > 0" par un "quantité commandé par le client" < "Quantité du stock". J'avoue que je sèche complètement.
Suis je loin du compte ?

Merci encore,
 

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...