Location de Produits — Guide complet
Installer, configurer et exploiter la location de produits : calendrier, planning, unités avec numéros de série, check-in/check-out, saisons, forfaits, caution en ligne séparée ou empreinte Stripe, demandes sans paiement, packs, API REST, webhooks et emails de rappel, pour PrestaShop 8 et 9.
Présentation
Le module Location de Produits (dfproductrental) ajoute un mode location activable produit par produit sur votre boutique PrestaShop, puis couvre toute l’exploitation du parc. Sur la fiche d’un produit louable, le client choisit ses dates dans un calendrier qui grise les jours réservés, en plage, en deux champs avec heures ou en date de début plus nombre de semaines. Le prix se calcule au jour selon des paliers dégressifs, un pourcentage du prix de vente ou des coefficients de durée, modulé par des saisons tarifaires et des forfaits fixes. La caution vit sur une ligne dédiée du panier, remboursable par avoir, ou passe en empreinte bancaire Stripe. Côté back-office : planning mensuel d’occupation, unités avec numéros de série, check-in et check-out avec état des lieux et retenue, statistiques, demandes sans paiement, packs synchronisés, API REST, webhooks sortants et emails de rappel par cron.
Idéal pour le matériel, le mobilier, l’équipement événementiel, les instruments, les véhicules ou l’outillage : tout article qui se loue plutôt qu’il ne se vend une fois pour toutes. Le mode location s’active uniquement sur les produits que vous désignez, sans dénaturer le reste de votre catalogue.
Compatibilité
- PrestaShop 8.0 à 9.x
- PHP 7.4 à 8.3
- Mono-boutique et multi-boutique
- 5 langues : FR, EN, ES, DE, IT (calendrier aussi traduit en NL, PT et PL)
- Thème Classic et thèmes personnalisés
- Aucune dépendance : pas de Composer, autoloader PSR-4 manuel, calendrier flatpickr embarqué localement
Installation
- Dans le back-office, ouvrez Modules > Gestionnaire de modules.
- Cliquez sur Installer un module puis sélectionnez le fichier
dfproductrental.zip. - Une fois installé, cliquez sur Configurer.
À l’installation, le module crée ses cinq tables (df_rental_product, df_rental_tier, df_rental_booking, df_rental_unit, df_rental_unit_assign), enregistre ses hooks, initialise ses réglages et ajoute cinq entrées sous le menu Catalogue > Location : Produits en location, Réservations, Planning, Unités et Statistiques. La mise à jour depuis toute version antérieure est prise en charge par des scripts d’upgrade tolérants : installez simplement le nouveau ZIP par-dessus, puis videz le cache PrestaShop.
Réglages généraux
La page de configuration du module regroupe les options globales.
- Délai tampon (jours) : jours bloqués après chaque retour pour préparer l’article. Valeur globale, surchargée par produit.
- Horizon de réservation (jours) : jusqu’à quelle date dans le futur un client peut réserver (365 par défaut).
- Expiration des paniers en attente (minutes) : au-delà, une réservation non confirmée libère ses dates (60 par défaut).
- Facturer la caution : active la ligne caution du panier ; désactivée, la caution est affichée sans être encaissée (mode empreinte).
- Facturer le jour du retour : oui, comptage calendaire, le jour du retour est un jour de location (du 14 au 20 = 7 jours) ; non, modèle rotation, le retour a lieu le jour suivant la période facturée (du 14 au 21 = 7 jours, une semaine va de lundi à lundi), ce jour restant indisponible pour un autre départ.
- Jours de fermeture hebdomadaires : jours sans départ ni retour possible (0 = dimanche à 6 = samedi, séparés par des virgules). Une location peut couvrir un jour fermé.
- Dates de fermeture : une date par ligne, au format AAAA-MM-JJ (ponctuelle) ou MM-JJ (récurrente chaque année, ex. 12-25).
- Saisons tarifaires : une saison par ligne,
début|fin|multiplicateur|libellé(voir plus bas). - Emails de rappel automatiques et jours d’avance : rappels avant début et avant retour, relance de retard, déclenchés par l’URL cron affichée sous le formulaire.
- Webhooks sortants et URL du webhook : notification de votre logiciel à chaque événement de réservation (voir plus bas).
- Caution par empreinte Stripe, clé publiable, clé secrète, empreinte obligatoire avant départ et texte de consentement : voir la section Caution.
- Sélection des dates, dates globales au panier, choix des dates dans le panier, heures de retrait et de retour, emplacement du bloc, masquage du bouton d’achat natif.
- Mode de caution (par produit, globale automatique, désactivée), tout le catalogue en location, grille de coefficients, synchronisation des packs, expiration des demandes, API.
Configurer un produit louable
Rendez-vous dans Catalogue > Location > Produits en location, puis Ajouter : produit, activation, mode de tarification (montants fixes, pourcentage du prix de vente ou coefficient), prix de base au jour, caution, durée minimum et maximum, unités disponibles, délai tampon, demande sans paiement et blocage du stock par les demandes.
Paliers de tarif dégressif
Chaque palier est défini par un jour minimum, un jour maximum et un prix au jour. Le module applique le palier dont l’intervalle contient la durée choisie ; un jour maximum à 0 signifie illimité ; sans palier correspondant, le prix de base s’applique. Exemple : 39 €/jour de 1 à 3 jours, 32 €/jour de 4 à 7 jours, 26 €/jour à partir de 8 jours.
Forfaits fixes
Sous les paliers, la zone Forfaits fixes accepte un forfait par ligne au format jours|prix HT|libellé, par exemple 7|199|Forfait semaine. Quand la durée choisie correspond exactement, ce prix rond remplace tout le calcul : ni paliers, ni coefficients, ni saisons. Combiné au mode de dates semaines, il rend l’offre parfaitement lisible.
Mode pourcentage
Le prix de base au jour, la caution et les paliers s’expriment en pourcentage du prix de vente hors taxes du produit. Un produit vendu 1000 € avec une caution à 10 exige 100 € de caution. Les montants suivent automatiquement les prix du catalogue.
Utilisation côté boutique
Choix des dates
Trois modes de sélection, réglés globalement : plage unique sur un calendrier de deux mois, deux champs début et fin (avec heures de retrait et de retour optionnelles), ou date de début plus nombre de semaines, la date de retour et le prix total se calculant automatiquement. Les jours réservés sont grisés ; les jours de fermeture ne peuvent être ni départ ni retour. Les dates globales au panier appliquent une période unique à toute la commande, modifiable depuis le panier.
Prix et réservation
Un récapitulatif détaille le nombre de jours, le prix au jour appliqué, le total de la location, la caution et le total général. Le bouton de réservation ajoute la location au panier : le prix de location est injecté via une remise spécifique liée au panier, le prix catalogue du produit restant intact, et la caution éventuelle apparaît sur sa propre ligne. Une réservation à l’état en attente bloque les dates ; les paniers non confirmés expirent et libèrent leurs dates ; la validation de commande confirme la réservation.
Caution : ligne dédiée ou empreinte Stripe
Caution facturée
Quand Facturer la caution est actif, la caution apparaît comme une ligne dédiée du panier : un produit technique Caution de location, hors TVA, invisible du catalogue, porte le montant total des cautions de la commande. Le prix des produits loués ne contient que la location. Sur la facture, la caution est une ligne à part ; son remboursement au retour du matériel tient en un avoir sur cette ligne, depuis la fiche commande. Si le client supprime la ligne caution de son panier, elle est recréée automatiquement. Le montant vient du mode choisi : caution par produit, ou globale automatique (montant de base TTC multiplié, avec minimum et arrondi, modifiable en back-office).
Empreinte bancaire Stripe
Avec Facturer la caution désactivé et Caution par empreinte Stripe activé (clés pk_ et sk_ renseignées), rien n’est encaissé. Après sa commande, le client est invité depuis la page de confirmation à enregistrer sa carte sur une page sécurisée propulsée par Stripe Elements : aucune donnée carte ne transite par la boutique, aucun montant n’est débité ni bloqué.
En cas de dommage constaté au retour : ouvrez la réservation, saisissez la caution retenue et son motif, enregistrez, puis cliquez sur Prélever la retenue via Stripe. Le montant est débité hors session dans la devise de la commande et l’identifiant du paiement est conservé sur la réservation. Un refus bancaire (3-D Secure) est affiché tel quel ; la retenue reste alors à encaisser autrement.
Empreinte obligatoire avant départ
Une option dédiée conditionne la sortie du matériel à l’enregistrement de la carte : une réservation payée sans empreinte est marquée En attente (départ bloqué) dans la liste des réservations (badge et filtre dédiés), et le bouton Départ refuse tant que la carte n’est pas enregistrée. Aucune commande payée n’est annulée automatiquement : vous gardez la main. Le client est accompagné : bouton Enregistrer ma carte sur sa page Mes locations, relance quotidienne par email avec le lien sécurisé (via l’URL cron, même si les autres rappels sont désactivés), et lien copiable depuis la fiche réservation pour un renvoi manuel. Un champ multilingue de la configuration permet enfin de remplacer le texte de consentement de la page d’empreinte par votre propre formulation, adaptée à vos conditions de location ; le texte par défaut mentionne déjà l’autorisation de débit à hauteur de la caution en cas de dommage.
Pourquoi pas une pré-autorisation classique ? Les réseaux carte expirent les pré-autorisations au bout de 7 jours : impossible de couvrir une location plus longue. L’enregistrement de carte n’expire pas ; c’est le modèle des plateformes de location. Le compte Stripe utilisé est indépendant du module de paiement de la boutique.
Unités et numéros de série
Dans Catalogue > Location > Unités, créez une fiche par exemplaire physique : produit, référence ou numéro de série, état (disponible ou en maintenance), activation, note interne. Dès qu’un produit possède au moins une unité, sa capacité locative devient le nombre d’unités actives et disponibles : la quantité configurée n’est plus utilisée, et passer une unité en maintenance la retire du stock sans toucher à la configuration.
Sur chaque réservation, le champ Unités affectées propose les unités libres sur la période (tampon compris) plus celles déjà affectées : sélectionnez les numéros de série remis au client. Une unité prise par une autre réservation est refusée avec un message. Les références apparaissent dans la liste des réservations, la fiche commande et le webhook.
Check-out et check-in
Dans la liste des réservations, deux actions rythment l’exploitation :
- Départ, sur une réservation confirmée : le matériel est remis au client, la location passe en cours et l’heure de remise est enregistrée.
- Retour, sur une location en cours : le matériel est restitué, la location passe rendue et l’heure de retour est enregistrée. Les dates se libèrent après le tampon éventuel.
La fiche réservation accueille l’état des lieux au départ et au retour, ainsi que le montant de caution retenue et son motif en cas de dommage, prêts pour le prélèvement Stripe ou l’avoir partiel.
Planning
Catalogue > Location > Planning affiche l’occupation du mois, une ligne par produit et une colonne par jour : cellule blanche libre, jaune partiellement réservée avec la quantité, rouge complète. Le survol d’une cellule liste chaque réservation (numéro, statut, quantité, client, marqueur pack). Les jours de fermeture et le jour courant sont marqués, la navigation passe de mois en mois, et le tampon post-retour de chaque produit est compté dans l’occupation.
Statistiques
Catalogue > Location > Statistiques analyse la période de votre choix (12 derniers mois par défaut) : par produit, nombre de réservations, jours loués multipliés par la quantité et bornés à la période, capacité, taux d’occupation, chiffre d’affaires location HT rattaché au démarrage de la location, cautions retenues, avec une ligne de totaux. Statuts pris en compte : confirmée, en cours, rendue.
Saisons tarifaires
La grille de configuration accepte une saison par ligne : début|fin|multiplicateur|libellé. Deux formats de bornes : dates complètes 2026-06-15|2026-09-15|1.3|Haute saison (saison ponctuelle) ou mois-jour 12-20|01-05|1.5|Fêtes (récurrente chaque année, chevauchement d’année géré). Chaque jour de location est facturé au tarif journalier multiplié par le coefficient de sa saison ; hors saison le coefficient vaut 1 ; en cas de chevauchement, la dernière ligne l’emporte. Les forfaits fixes ignorent les saisons : c’est le principe d’un prix rond.
Emails de cycle de vie (cron)
Trois emails automatiques accompagnent chaque location payée : rappel avant le début, rappel avant le retour (délai d’avance configurable, 1 = la veille) et relance de retard quand le matériel n’est pas rendu à la date prévue. Activez l’interrupteur puis appelez une fois par jour l’URL cron sécurisée par jeton affichée sous le formulaire de configuration (tâche cron de l’hébergement ou service externe). Chaque email n’est envoyé qu’une seule fois par réservation, dans la langue de la commande du client, en cinq langues. L’appel cron purge aussi les demandes expirées.
Demande de réservation sans paiement
Sur les produits où l’option est active, la fiche produit affiche un bouton de demande : le client choisit ses dates, laisse ses coordonnées (identifiées automatiquement s’il est connecté) et un message, sans passer en caisse. La demande apparaît dans les réservations avec le statut Demande en attente : Accepter revérifie la disponibilité puis confirme et notifie le client ; Refuser libère les dates et notifie le client. Le blocage du stock par les demandes se règle par produit et demande par demande, et un délai d’expiration peut annuler les demandes sans réponse.
Packs de produits
Les packs natifs PrestaShop sont synchronisés : réserver un pack bloque la disponibilité de chacun de ses composants louables sur la même période (quantités du pack comprises), réserver un composant seul rend le pack indisponible, et toute modification de la réservation du pack est répercutée sur ses composants. Les réservations de composants sont masquées côté client et visibles en back-office avec un badge Pack. Un réglage global désactive la mécanique.
API REST
Activez l’API dans la configuration : deux jetons régénérables (lecture-écriture et lecture seule), transmis via X-Api-Key ou Authorization: Bearer.
GET ping: authentification et version.GET products: produits louables et leur configuration.GET availability: disponibilités jour par jour, unités restantes comprises.GET bookings: réservations, filtrables parstatus,id_product,from,to,updated_since,external_reference.POST bookings: création, idempotente viaexternal_reference.POST bookings&id=N: modification ;DELETE bookings&id=N: annulation.
Webhooks sortants
Activez les webhooks et renseignez l’URL de votre logiciel : à chaque événement, elle reçoit un POST JSON contenant la réservation complète (dates, quantité, prix, statut, client, unités affectées, horodatages de check-in et check-out, retenue). Deux en-têtes accompagnent chaque appel : X-DfRental-Event (nom de l’événement) et X-DfRental-Signature (HMAC-SHA256 du corps avec le secret affiché dans le panneau dédié, régénérable). Événements émis : booking.requested, booking.confirmed, booking.declined, booking.cancelled, booking.active, booking.returned, plus booking.created et booking.updated pour l’API. L’envoi est en best effort avec un délai court : un récepteur en panne ne bloque jamais la boutique.
Webhooks et API se complètent : les webhooks notifient votre logiciel en temps réel, l’API avec updated_since permet de rattraper l’historique après une indisponibilité du récepteur.
Suivi des réservations
Catalogue > Location > Réservations liste toutes les réservations avec produit, client, commande, dates, unités affectées et statut coloré : demande en attente, en attente, confirmée, en cours, rendue, refusée, annulée. Les actions Accepter, Refuser, Départ et Retour s’affichent selon le statut. Le détail apparaît aussi dans le panier, sur la confirmation de commande, dans la fiche commande du back-office et sur la page Mes locations de l’espace client.
FAQ et dépannage
Le prix de location modifie-t-il le prix de mon produit ?
Non. Le prix est injecté via une remise spécifique liée au panier en cours, et la caution vit sur sa propre ligne. Le prix catalogue reste inchangé.
Le mode semaines donne un retour le dimanche, je veux lundi vers lundi
Désactivez Facturer le jour du retour : une semaine va alors de lundi à lundi, 7 jours facturés, le retour ayant lieu le jour suivant la période facturée. Ce jour reste indisponible pour un autre départ.
Le client n’a pas enregistré son empreinte Stripe
Tant qu’aucune carte n’est enregistrée, le lien est proposé sur la page de confirmation de commande et un bouton Enregistrer ma carte apparaît sur la page Mes locations du compte client. Avec l’option Empreinte obligatoire avant départ, le client est en plus relancé quotidiennement par email avec le lien sécurisé, et le bouton Départ reste bloqué. Le lien est aussi copiable depuis la fiche réservation pour un renvoi manuel ; la fiche indique Empreinte non enregistrée tant que le parcours n’est pas terminé.
Le prélèvement Stripe est refusé
La banque du client peut refuser un débit hors session (3-D Secure). Le message de Stripe est affiché tel quel dans le back-office. La retenue reste alors à encaisser par un autre canal ; la réservation conserve le montant et le motif.
La capacité de mon produit ne suit plus la quantité configurée
C’est le comportement attendu dès qu’une unité existe pour ce produit : la capacité devient le nombre d’unités actives et disponibles. Supprimez les unités pour revenir à la quantité configurée.
Une demande acceptée crée-t-elle une commande ?
Non. L’acceptation confirme la réservation et bloque les dates, sans créer de commande PrestaShop. Vous encaissez le règlement par le canal de votre choix et suivez la location depuis l’écran des réservations.
Les emails de rappel ne partent pas
Vérifiez que l’interrupteur des emails de rappel est actif et que l’URL cron est bien appelée quotidiennement : elle répond en JSON avec le nombre d’envois. Chaque email n’est envoyé qu’une fois par réservation, uniquement pour les réservations rattachées à une commande.
Le calendrier ne s’affiche pas sur la fiche produit
Vérifiez que le produit est configuré et actif dans Produits en location. Videz ensuite le cache de PrestaShop (Paramètres avancés > Performances) et, pendant vos tests, désactivez la combinaison des fichiers (CCC).
L’API renvoie 401
Vérifiez que l’API est activée et que le jeton transmis correspond au jeton affiché. Après une régénération, mettez à jour vos intégrations. Le jeton lecture seule n’est accepté que sur les endpoints GET.
Est-ce compatible PrestaShop 9 ?
Oui. Le module est compatible PrestaShop 8 et 9, en multi-boutique et multilingue. Le formatage des prix utilise le Locale courant, conforme aux pratiques PrestaShop 9.