Masquer les produits épuisés
baba_productqtvisibility · v2.0.0 · AGPL-3.0-or-later
Masque les produits en rupture, puis leur rend exactement la visibilité qu'ils avaient au retour du stock — jamais « visible partout ». Un produit réglé sur « catalogue seul » le redevient, et celui que vous avez masqué vous-même reste masqué.
Ce que ce module fait, et ce qu'il refuse
- ✓Rend la visibilité d'origine, pas « visible partout » — « catalogue seul » et « recherche seule » survivent à la rupture
- ✓Un produit que vous avez masqué vous-même n'est jamais rendu visible
- ✓Le stock TOTAL décide : une seule déclinaison épuisée ne masque pas le produit
- ✓Un produit commandable en rupture reste vendable — et c'est réglable
- ✓La désinstallation rend sa visibilité à chaque produit masqué, avant de supprimer la table
- ✓Seuil de rupture réglable, et visibilité de rupture au choix (nulle part, recherche seule, catalogue seul)
- ✓L'écran affiche combien de produits sont masqués en ce moment, lu en base
- ✓N'écrit que la colonne visibility — jamais Product::update(), qui réécrirait tout le produit
- ✓Multiboutique : écrit dans la boutique du mouvement
- ✓42 vérifications livrées avec le module, rejouables sans PHPUnit ni base
Le problème
Un produit en rupture reste dans votre catalogue, dans vos listes et dans votre moteur de recherche interne. Le visiteur clique, et trouve un produit qu'il ne peut pas acheter.
Ce module le masque le temps de la rupture, puis lui rend exactement la visibilité qu'il avait quand le stock revient.
Ce que le module garantit, et pourquoi c'est la seule chose qui compte
Il ne rend que ce qu'il a pris. Avant de masquer un produit, il écrit dans sa propre table la visibilité qu'il remplace. Au retour du stock, il remet *celle-là* — pas « visible partout ».
C'est la différence entre un module utilisable et un module qui détruit votre travail. Une boutique vivante a des produits réglés sur « catalogue seul » (hors recherche), sur « recherche seule » (accessibles par un lien, hors navigation), ou masqués exprès. Un module qui écrit « visible partout » au retour du stock efface ces décisions, une par une, à chaque réapprovisionnement — et rien ne vous le signale.
Quatre conséquences, toutes mesurées sur une boutique réelle :
| Situation | Ce qui se passe |
|---|---|
| Produit en « catalogue seul », rupture puis retour | il redevient « catalogue seul » |
| Produit que vous avez masqué vous-même, rupture puis retour | il reste masqué — ce n'est pas nous qui l'avons mis là |
| Vous changez sa visibilité pendant la rupture | la mémoire tient : c'est l'originale qui vous sera rendue |
| Le module est désinstallé | chaque produit masqué retrouve sa visibilité avant que la table ne disparaisse |
Les déclinaisons comptent comme un tout
Le module lit le stock total du produit, toutes déclinaisons confondues. Une seule taille épuisée ne masque pas le produit : les autres sont encore à vendre.
Mesuré : produit à deux déclinaisons de 300, l'une vidée — total 300, le produit reste visible. Les deux vidées — total 0, il est masqué. L'une réapprovisionnée — il revient.
Un produit commandable en rupture reste vendable
Si la commande en rupture est autorisée, sur le produit ou par le réglage de la boutique, le masquer ferait perdre la vente. Le module ne le masque donc pas — et c'est réglable, si vous préférez l'inverse.
Le réglage PrestaShop a trois états, pas deux : refusée, autorisée, ou « comme la boutique ». Le troisième est lu pour ce qu'il est.
Réglages
Back-office → Modules → *Masquer les produits épuisés* → Configurer.
- Activer le masquage : coupé, le module ne touche plus à rien. Les produits
déjà masqués le restent — un bouton les rend tous d'un geste, et la désinstallation le fait toute seule.
- Seuil de rupture : un produit est traité comme épuisé quand son stock total
est inférieur ou égal à ce nombre. 0 = épuisé au sens strict. Borné de 0 à 1 000 000.
- Visibilité en rupture : *nulle part*, *recherche seule* ou *catalogue
seul*. C'est ce qu'on écrit pendant la rupture ; la visibilité d'avant est retenue quoi qu'il arrive.
- Ne pas masquer si la commande en rupture est autorisée : par défaut oui.
L'écran affiche aussi combien de produits le module masque en ce moment — un chiffre lu en base, pas une promesse.
Ce que le module ne fait pas
- Il ne touche pas aux prix, aux stocks, ni à quoi que ce soit d'autre que la
visibilité du produit.
- Il ne passe pas par la mise à jour complète du produit, qui réécrit toutes
les colonnes et toutes les langues et prévient tous les modules — à chaque mouvement de stock, donc des milliers de fois pendant un import. Deux écritures ciblées suffisent.
- En multiboutique, il écrit dans la boutique du mouvement, et ne touche au
reflet global que si le mouvement concerne la boutique par défaut du produit.
- Il ne purge aucun cache de page. Si un cache de pages complètes est devant
votre boutique, la disparition du produit suivra l'expiration de ce cache.
Le test est livré avec le module
php tests/VisibiliteStockTest.php
42 vérifications, sans dépendance ni base de données. La décision — masquer, rendre, ou ne rien faire — vit à part du reste, et se rejoue seule.
Installation
Back-office → Modules → Installer un module → déposer le .zip, puis Configurer.
Ce que la licence exige de vous
Ce module est sous AGPL-3.0-or-later. Installé sans modification, vous n'avez rien à publier. Modifié et servi à vos visiteurs, vous devez leur offrir la source de ce module modifié — jamais celle de votre boutique, de votre thème, ni du cœur de PrestaShop. Le fichier NOTICE de l'archive porte les attributions exactes.
Le module est gratuit. Une adresse e-mail suffit.
Sans compte à créer, et la lettre d'information reste facultative.