Ajoutez la prise de rendez-vous par créneau horaire à votre site Larapen. Gérez les services, les prestataires, les horaires hebdomadaires et un calendrier de réservation interactif — avec une intégration de paiement optionnelle.
Gestion des services & prestataires
Créez des services réservables avec tarifs, durée et capacité. Assignez des prestataires avec des horaires hebdomadaires individuels et des dates bloquées.
Calendrier interactif
Vue calendrier admin avec filtre par prestataire. Calendrier côté visiteur avec disponibilité des créneaux en temps réel via AJAX.
Génération de créneaux horaires
Génération automatique des créneaux à partir des horaires des prestataires. Respecte les pauses, les dates bloquées, les limites de capacité et le délai minimum de réservation.
Intégration de paiement
Paiement optionnel requis avant confirmation. Supporte Stripe, PayPal, Paddle et MoMo via l’interface Payable.
Notifications par e-mail
Notifications configurables pour les clients, les administrateurs et les prestataires lors de la création de rendez-vous, des changements de statut et des annulations.
Support multilingue
Les noms de services, les slugs et les descriptions sont traduisibles. Toutes les chaînes de l’interface utilisent le système de traduction.
Cas d’utilisation
- Salon ou Spa : les clients choisissent un service (coupe de cheveux, massage), une date et un créneau horaire parmi les disponibilités.
- Cabinet de conseil : les visiteurs réservent une consultation de 30 ou 60 minutes avec un conseiller spécifique.
- Cabinet médical : les patients planifient des visites avec des praticiens. Les pauses et les dates bloquées maintiennent le calendrier à jour.
- Cours de fitness : les membres réservent des places dans des séances de groupe avec des créneaux horaires à capacité limitée.
- Tutorat & Coaching : les étudiants réservent des sessions individuelles ou en groupe avec des tuteurs, chacun ayant son propre horaire de disponibilité.
Prérequis
- Larapen CMS v1.0.0 ou ultérieur
- PHP 8.3+
- MySQL 8.0+
Installation
Étape 1 : Téléverser l’add-on
Dans le panneau d’administration, allez dans Admin → Extensions → Add-ons et cliquez sur le bouton Télécharger un add-on. Sélectionnez le fichier ZIP de l’add-on : le système le décompresse automatiquement et l’add-on apparaît dans la liste des add-ons installés.
Étape 2 : Activer l’add-on
Repérez Rendez-vous dans la liste et cliquez sur Activer. Ses migrations, ses seeders (le cas échéant) et ses permissions sont mis en place automatiquement.
Étape 3 : Configurer
Naviguez vers Admin → Rendez-vous → Paramètres pour configurer les services, les règles de disponibilité, les fenêtres de réservation et les notifications. Voir Configuration.
Code d’achat (clé de licence)
Rendez-vous est vendu comme un produit distinct : il possède donc son propre code d’achat (clé de licence) — différent du code d’achat de l’application principale et de celui de chaque autre add-on. Il vous est demandé lorsque vous activez Rendez-vous dans Panneau d’administration → Add-ons.
Nos produits sont vendus sur trois plateformes. La manière dont vous recevez un code d’achat dépend de l’endroit où vous avez acheté le produit.
| Plateforme / Marketplace | Comment obtenir le code d’achat | Où le retrouver |
|---|---|---|
| Boutique bedigit.com Achat sur le site (Boutique) |
Généré automatiquement lorsque la commande est payée, puis envoyé par e-mail — soit dans un e-mail de licence dédié, soit dans l’e-mail de confirmation de commande. | Mon compte → Mes licences sur bedigit.com |
| Gumroad | Créé dès que Gumroad nous notifie la vente, puis envoyé dans un e-mail séparé, en plus du reçu Gumroad. | L’e-mail de licence, votre Bibliothèque Gumroad et Mon compte → Mes licences sur bedigit.com |
| Envato Market CodeCanyon |
Délivré par Envato, et non par nous, et jamais envoyé par e-mail : vous le téléchargez vous-même depuis votre compte Envato. | Compte Envato → Downloads → License certificate & purchase code |
1. Boutique bedigit.com (achat sur le site)
- Dès que le statut de paiement de la commande passe à Payée, une clé de licence est générée automatiquement pour chaque article sous licence de la commande (une clé par unité achetée — l’achat de 3 unités donne 3 clés distinctes).
- Elle est envoyée à l’adresse e-mail utilisée pour la commande, soit dans un e-mail de licence dédié, soit dans l’e-mail de confirmation de commande. Vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
- La clé reste disponible dans votre compte sous Mon compte → Mes licences. Les clés sont masquées dans la liste ; ouvrez la page de détail de la licence pour révéler et copier la clé complète, voir les domaines sur lesquels elle est activée, et désactiver un domaine pour libérer un emplacement d’activation.
- La facture correspondante se trouve sous Mon compte → Mes commandes.
2. Gumroad
- Un achat sur Gumroad génère deux e-mails distincts : le reçu Gumroad (envoyé par Gumroad, donnant accès aux fichiers) et un e-mail de clé de licence (envoyé par bedigit.com) qui contient votre code d’achat.
- L’e-mail de clé de licence est généré dès que Gumroad nous notifie la vente : il arrive donc normalement quelques secondes après le paiement. Là encore, vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
- Lorsque le produit Gumroad utilise la fonctionnalité de clés de licence propre à Gumroad, la même clé apparaît aussi dans votre reçu Gumroad et sous Bibliothèque → votre achat sur gumroad.com.
- Utilisez la même adresse e-mail sur bedigit.com que sur Gumroad : vos clés sont alors liées automatiquement à votre compte et listées sous Mon compte → Mes licences, même si vous vous inscrivez après l’achat. Vous pouvez aussi ajouter une clé Gumroad manuellement depuis Mon compte → Mes licences Gumroad.
3. Envato Market (CodeCanyon)
- Les codes d’achat Envato sont délivrés et fournis par Envato Market, jamais envoyés par e-mail par nos soins — il n’y a donc rien à chercher dans votre dossier de spam : vous récupérez le code depuis votre compte Envato.
- Connectez-vous à votre compte Envato / CodeCanyon, ouvrez la page Downloads, repérez l’article, puis choisissez License certificate & purchase code dans le menu déroulant Download. Le code est inscrit dans ce certificat.
- Un code d’achat Envato ressemble à
12345678-90ab-cdef-1234-567890abcdef(8-4-4-4-12 caractères). Il ne change jamais, et le renouvellement du support de l’article n’en génère pas de nouveau. - Article officiel Envato : Where Is My Purchase Code?
Configuration
Tous les paramètres sont gérés dans Admin → Rendez-vous → Paramètres
(stockés dans la table settings, groupe appointment).
Les valeurs par défaut sont définies dans config/appointment.php.
| Paramètre | Description | Défaut |
|---|---|---|
appointment_enabled |
Afficher ou masquer la page de rendez-vous côté visiteur. | true |
appointment_multi_provider |
Permettre aux clients de choisir un prestataire spécifique lors de la réservation. Désactivé, le système assigne automatiquement un prestataire. | false |
appointment_provider_selection |
Afficher l’étape de sélection du prestataire dans l’assistant de réservation (nécessite le mode multi-prestataires). | true |
appointment_pending_blocks_slot |
Activé, les rendez-vous en attente bloquent également le créneau horaire. Désactivé, seuls les rendez-vous confirmés/terminés bloquent les créneaux. | true |
appointment_advance_days |
Combien de jours à l’avance les clients peuvent réserver. | 60 |
appointment_min_advance_hours |
Heures minimum avant qu’un rendez-vous puisse être réservé (empêche les réservations de dernière minute). | 2 |
appointment_slot_interval |
Remplacer l’intervalle des créneaux horaires en minutes. Laisser vide pour utiliser la durée du service. | (null : utilise la durée du service) |
appointment_services_per_row |
Nombre de cartes de service par ligne sur la page de rendez-vous côté visiteur. | 3 |
appointment_providers_per_row |
Nombre de cartes de prestataire par ligne sur la page de rendez-vous côté visiteur. | 4 |
appointment_notification_email |
Adresse e-mail pour recevoir les notifications admin de rendez-vous. | (vide) |
appointment_require_payment |
Exiger le paiement avant la confirmation du rendez-vous. S’applique uniquement aux services avec un prix > 0. | false |
appointment_cancellation_policy |
Politique d’annulation en texte libre affichée sur la page de rendez-vous (traduisible). | (vide) |
appointment_captcha_enabled |
Activer le défi CAPTCHA sur le formulaire de rendez-vous. | false |
Paramètres des libellés du prestataire
| Paramètre | Description | Défaut |
|---|---|---|
appointment_provider_step_label |
Titre personnalisé pour l’étape de sélection du prestataire (traduisible). Laisser vide pour utiliser la traduction par défaut. | (vide : utilise la valeur par défaut) |
appointment_provider_any_label |
Libellé de l’option “Tout prestataire disponible” (traduisible). Laisser vide pour utiliser la valeur par défaut. | (vide : utilise la valeur par défaut) |
Paramètres de notification
| Paramètre | Description | Défaut |
|---|---|---|
appointment_notify_admin_on_new_appointment |
Envoyer un e-mail à l’adresse de notification lors de nouveaux rendez-vous. | true |
appointment_notify_client_on_appointment |
Envoyer un e-mail de confirmation au client lors de la soumission du rendez-vous. | true |
appointment_notify_client_on_status_change |
Notifier le client lorsque le statut du rendez-vous change (confirmé, annulé, terminé). | true |
appointment_notify_provider_on_new_appointment |
Notifier le prestataire assigné lorsqu’il reçoit un nouveau rendez-vous. | true |
appointment_notify_provider_on_cancellation |
Notifier le prestataire assigné lorsqu’un rendez-vous est annulé. | true |
Admin : Services
La page Services (Rendez-vous → Services) gère votre catalogue de services réservables.
Liste des services
Un tableau triable et paginé affichant :
- Nom (traduisible)
- Durée (formatée, ex. : “1h 30min”)
- Prix (formaté avec devise)
- Capacité max.
- Nombre de rendez-vous
- Statut (badge actif/inactif)
- Position (ordre d’affichage)
Actions par ligne : Modifier, Supprimer.
Création & modification de services
- Nom (traduisible, requis pour la langue par défaut)
- Slug (traduisible, généré automatiquement si vide)
- Description (traduisible)
- Durée (minutes) : requise, 5–480 minutes. Détermine la longueur du créneau.
- Prix (numérique, optionnel)
- Devise (requise, parmi les devises actives)
- Capacité max. (entier, 1–100)
- Actif bascule
- Position (ordre d’affichage)
Admin : Prestataires
Les prestataires représentent les membres du personnel ou les ressources qui fournissent vos services. Gérés dans Rendez-vous → Prestataires.
Liste des prestataires
Un tableau paginé affichant :
- Avatar (ou initiales par défaut)
- Nom, E-mail, Téléphone
- Nombre de services attribués
- Nombre de rendez-vous
- Statut (actif/inactif)
Actions par ligne : Modifier, Supprimer.
Création d’un prestataire
- Nom, E-mail, Téléphone
- Biographie : description textuelle
- Avatar : téléversement d’image (stocké dans
appointment/providers/sur le disque public) - Compte utilisateur lié : clé étrangère optionnelle vers la table
users - Services attribués : sélection multiple parmi les services actifs
- Actif bascule, Position
Lorsqu’un prestataire est créé, un horaire hebdomadaire par défaut est automatiquement initialisé : Lundi–Vendredi 09h00–17h00 avec une pause de 12h00–13h00. Samedi et Dimanche sont désactivés.
Horaire hebdomadaire
L’éditeur d’horaire (Prestataires → {prestataire} → Modifier → Onglet Horaire) permet de configurer chaque jour de la semaine :
- Disponible bascule (activé/désactivé)
- Heure de début et Heure de fin
- Début de pause et Fin de pause (période de déjeuner/repos optionnelle)
Les créneaux qui chevauchent la fenêtre de pause sont automatiquement exclus de la disponibilité.
Dates bloquées
Dates individuelles où un prestataire n’est pas disponible (jours fériés, congés maladie, vacances). Gérées depuis la page de modification du prestataire.
- Date (requise)
- Raison (optionnelle : ex. “Jour férié”, “Vacances”)
Les dates bloquées peuvent également être globales (aucun prestataire assigné) pour bloquer tous les prestataires à cette date.
Admin : Rendez-vous
La page Rendez-vous (Rendez-vous → Rendez-vous) affiche tous les rendez-vous dans un tableau paginé.
Liste des rendez-vous
Filtrable par statut et par prestataire. Les colonnes incluent :
- Nom & e-mail du client
- Nom du service
- Nom du prestataire
- Date & heure
- Statut badge (en attente/confirmé/annulé/terminé)
- Statut du paiement (si le paiement est activé)
Des cartes de statistiques en haut affichent : le nombre total de rendez-vous, le nombre en attente, le nombre confirmé, les rendez-vous du jour et ceux de la semaine.
Détail du rendez-vous & gestion des statuts
La page de détail (Rendez-vous → {rendez-vous}) affiche :
- Informations du client : nom, e-mail, téléphone, adresse IP, horodatage de réservation
- Informations du rendez-vous : service, prestataire, date, heure de début, heure de fin, prix total
- Détails du paiement (le cas échéant) : statut, mode, référence, horodatage de paiement
- Gestion des statuts : boutons pour changer le statut avec transitions :
- En attente → Confirmé, Annulé
- Confirmé → Terminé, Annulé, Remettre en attente
- Terminé → Remettre en confirmé
- Annulé → Rouvrir (retour à En attente)
- Raison de l’annulation : affichée lors de l’annulation ; effacée lors de la réouverture
- Notes administratives : notes internes non visibles par le client
- Notes client : notes soumises par le client lors de la réservation
appointment_notify_client_on_status_change est activé).
Les annulations notifient également le prestataire assigné.
Vue calendrier
La page Calendrier (Rendez-vous → Rendez-vous → Calendrier) fournit une vue mensuelle visuelle :
- Les événements sont chargés via AJAX (
GET admin/appointment/appointments/calendar-events). - Filtrer par prestataire via le menu déroulant.
- Les rendez-vous s’affichent comme des événements horaires sur le calendrier.
- Code couleur par statut (warning=en attente, success=confirmé, danger=annulé, info=terminé).
- Cliquez sur un événement pour accéder à la page de détail du rendez-vous.
Admin : Paramètres
La page de paramètres (Rendez-vous → Paramètres) est organisée en sections :
Paramètres généraux
- Activer les rendez-vous : bascule pour afficher/masquer la page de rendez-vous côté visiteur.
- Mode multi-prestataire : permettre aux clients de choisir leur prestataire.
- Autoriser le choix du prestataire : afficher l’étape de sélection du prestataire dans l’assistant (nécessite le mode multi-prestataires).
Libellés du prestataire
- Libellé de l’étape prestataire : titre personnalisé pour l’étape de sélection du prestataire (traduisible).
- Libellé de l’option “Tout” : libellé de l’option “Tout prestataire disponible” (traduisible).
Planification
- Les rendez-vous en attente bloquent les créneaux : bascule.
- Intervalle des créneaux : remplacer la valeur par défaut (durée du service).
- Rendez-vous à l’avance (jours) : jusqu’à combien de jours à l’avance les clients peuvent réserver.
- Délai minimum (heures) : empêche les réservations de dernière minute.
- Services par ligne : nombre de cartes de service par ligne côté visiteur.
- Prestataires par ligne : nombre de cartes de prestataire par ligne côté visiteur.
Paiement
- Exiger le paiement : bascule. S’applique uniquement aux services avec un prix > 0.
- Un avertissement est affiché si aucun add-on de passerelle de paiement n’est actif.
Notifications
- E-mail de notification : adresse e-mail admin pour les alertes de rendez-vous.
- Cinq bascules contrôlant quels e-mails sont envoyés (voir Notifications).
Politique d’annulation
- Politique d’annulation : texte libre affiché sur la page de rendez-vous (traduisible).
CAPTCHA
- Activer le CAPTCHA sur le formulaire de rendez-vous : bascule. Nécessite qu’un fournisseur CAPTCHA soit configuré dans les paramètres principaux.
Côté visiteur : Page de rendez-vous
La page de prise de rendez-vous est disponible à /{locale}/appointment et fournit un assistant étape par étape.
Routes
| Méthode | URL | Nom de route | Description |
|---|---|---|---|
| GET | /{locale}/appointment |
appointment.index.localized |
Page de l’assistant de rendez-vous |
| POST | /{locale}/appointment |
appointment.store.localized |
Soumettre un rendez-vous |
| GET | /{locale}/appointment/confirmation/{appointment} |
appointment.confirmation.localized |
Page de confirmation |
| GET | /{locale}/appointment/my-appointments |
appointment.my-appointments.localized |
Historique des rendez-vous de l’utilisateur (authentification requise) |
Des variantes non localisées (sans {locale}) sont également enregistrées.
Étapes de l’assistant
- Choisir un service : grille de cartes des services actifs affichant le nom, la description, la durée et le prix.
- Choisir un prestataire : affiché uniquement si le mode multi-prestataires est activé. Inclut une option “Tout prestataire disponible”.
- Choisir la date & l’heure : calendrier interactif affichant les jours disponibles/indisponibles. Sélectionner une date charge les créneaux horaires via AJAX.
- Vos coordonnées : nom, e-mail, téléphone (optionnel), notes (optionnel). Pré-rempli pour les utilisateurs authentifiés.
- Confirmer : carte récapitulative avec toutes les sélections. Le bouton de soumission déclenche le rendez-vous.
API de créneaux & disponibilité
Deux endpoints JSON alimentent le calendrier côté visiteur et la sélection de créneaux :
/{locale}/appointment/slots
Description
Retourne les créneaux horaires disponibles pour un service, un prestataire et une date spécifiques.
Paramètres de requête
service_id |
Requis | ID du service |
provider_id |
Optionnel | ID du prestataire (null = tout prestataire disponible) |
date |
Requis | Date (AAAA-MM-JJ) |
Réponse
/{locale}/appointment/availability
Description
Retourne la disponibilité au niveau du jour pour un mois entier. Utilisé pour afficher le calendrier avec des indicateurs disponible/indisponible.
Paramètres de requête
year |
Requis | Année (2024–2030) |
month |
Requis | Mois (1–12) |
service_id |
Optionnel | ID du service |
provider_id |
Optionnel | ID du prestataire |
Réponse
Valeurs : past, available, unavailable.
Logique de génération des créneaux
Les créneaux horaires sont générés comme suit :
- Charger l’horaire du prestataire pour le jour de la semaine demandé.
- Vérifier les dates bloquées (spécifiques au prestataire et globales).
- Générer les créneaux de
start_timeàend_timeaux intervalles deslot_interval(ou de la durée du service). - Exclure les créneaux qui chevauchent la fenêtre de pause.
- Exclure les créneaux antérieurs au délai minimum de réservation.
- Pour chaque créneau candidat, compter les rendez-vous bloquants existants (confirmés + terminés, et en attente si
pending_blocks_slotest activé). - Inclure le créneau uniquement si le nombre de chevauchements est inférieur à
max_capacity.
Lorsqu’aucun prestataire n’est spécifié, le système agrège les créneaux de tous les prestataires actifs pour le service. Si aucun prestataire n’existe, un horaire par défaut intégré (Lun–Ven 09h00–17h00, pause 12h00–13h00) est utilisé comme solution de repli.
Page de confirmation
Après une prise de rendez-vous réussie (ou un paiement réussi), l’utilisateur est redirigé vers
/{locale}/appointment/confirmation/{appointment}.
- Affiche un message de succès avec les détails du rendez-vous.
- Affiche le nom du service, le prestataire, la date, le créneau horaire et le prix total.
- Note de statut expliquant que le rendez-vous est en attente de confirmation.
- Liens vers “Retour à l’accueil” et “Prendre un autre rendez-vous”.
Paiement
Lorsque appointment_require_payment est activé et que le rendez-vous a un prix total > 0,
le flux de réservation redirige vers une page de paiement au lieu de la page de confirmation.
Routes
| Méthode | URL | Nom de route | Description |
|---|---|---|---|
| GET | /{locale}/appointment/checkout/{appointment} |
appointment.checkout.localized |
Page de paiement |
| POST | /{locale}/appointment/checkout/{appointment} |
appointment.checkout.process.localized |
Traiter le paiement |
Interface Payable
Le modèle Appointment implémente l’interface App\Contracts\Payable, fournissant :
getPayableAmount(): retourne le prix totalgetPayableCurrency(): depuis la devise du service ou la devise par défaut du sitegetPayableDescription(): ex. “Rendez-vous : Coupe de cheveux le 15 mars 2026”getPayableCustomerEmail(),getPayableCustomerName()markAsPaid(): définit le statut à Confirmé, payment_status à “paid”markPaymentFailed(): définit payment_status à “failed”getPaymentSuccessUrl(): redirige vers la page de confirmationgetPaymentCancelUrl(): redirige vers la page de paiement
Passerelles de paiement supportées
La page de paiement fonctionne avec tout add-on de passerelle de paiement actif :
- Stripe : Payment Intents côté client avec Stripe.js
- PayPal : paiement par redirection
- Paddle : superposition inline ou redirection
- MoMo : mobile money avec saisie du numéro de téléphone
appointment_require_payment est activé,
un avertissement est affiché sur la page de paramètres admin. La page de paiement n’affichera aucune option de paiement.
Mes rendez-vous
Les utilisateurs authentifiés peuvent consulter leur historique de rendez-vous à /{locale}/appointment/my-appointments.
- Correspond aux rendez-vous par
user_idouclient_email(couvre les rendez-vous pris avant l’inscription). - Liste paginée (15 par page) triée par date décroissante.
- Chaque entrée affiche : nom du service, prestataire, date, créneau horaire, badge de statut et statut du paiement.
Cette page est également accessible depuis le menu du compte utilisateur via le lien “Mes rendez-vous”
(enregistré dans addon.json sous provides.user_menu).
Notifications
L’add-on utilise le système de Notification de Laravel avec des destinataires de courrier à la demande.
Toutes les notifications sont envoyées via le service AppointmentManager et capturent silencieusement toute erreur d’envoi.
| Classe de notification | Destinataire | Déclencheur | Paramètre |
|---|---|---|---|
AppointmentConfirmationNotification |
Client | Rendez-vous créé (après paiement, si requis) | notify_client_on_appointment |
NewAppointmentAdminNotification |
Admin (notification_email) | Rendez-vous créé | notify_admin_on_new_appointment |
NewAppointmentProviderNotification |
Prestataire assigné | Rendez-vous créé | notify_provider_on_new_appointment |
AppointmentStatusChangeNotification |
Client | Statut changé en confirmé/annulé/terminé | notify_client_on_status_change |
AppointmentCancellationProviderNotification |
Prestataire assigné | Rendez-vous annulé | notify_provider_on_cancellation |
AppointmentObserver, qui surveille les changements du champ status.
Cela garantit que les notifications se déclenchent quel que soit le moyen de mise à jour du statut (panneau d’administration, API, etc.).
Mise à jour
Il existe deux manières de mettre à jour cet add-on : via le panneau d’administration (recommandé) ou en remplaçant manuellement les fichiers.
Méthode 1 : Téléchargement via le panneau d’administration (Recommandé)
- Téléchargez le dernier fichier
.zipde cet add-on. - Allez dans Panneau d’administration → Add-ons et cliquez sur le bouton Télécharger.
- Sélectionnez ou glissez le fichier
.zipdans la zone de téléchargement. - Une invite de confirmation affichera les numéros de version actuel et nouveau. Cliquez sur Remplacer pour continuer.
- Allez dans Panneau d’administration → Mise à jour système (
/admin/update) pour appliquer les migrations de base de données en attente.
Méthode 2 : Remplacement manuel des fichiers
Étape 1 : Remplacer les fichiers
Remplacez le répertoire de l’add-on par la nouvelle version.
Étape 2 : Exécuter les migrations
php artisan migrate
Les migrations en attente ne s’exécutent qu’une seule fois : la commande peut être relancée sans risque.
Étape 3 : Reconstruire les assets
Requis si la mise à jour inclut des fichiers SCSS/JS de thème nouveaux ou modifiés.
Étape 4 : Vider les caches
php artisan config:clear
php artisan route:clear
php artisan view:clear
Désinstallation
Éteindre un add-on sans rien perdre, c’est le désactiver : allez dans Panneau d’administration → Add-ons, trouvez Appointments et cliquez sur Désactiver.
- Ses routes, ses vues, ses entrées de menu d’administration et ses permissions cessent d’être enregistrées, et ses pages publiques ne répondent plus.
- Ses tables de base de données et toutes les données qu’elles contiennent sont conservées, et ses fichiers restent dans
extensions/addons/appointment/. Rien n’est supprimé. - Le code d’achat enregistré lors de l’activation est conservé lui aussi : réactiver l’add-on ne le redemande pas.
- La désactivation est refusée tant qu’un autre add-on actif dépend de celui-ci : désactivez d’abord cet add-on.
Cliquez sur Activer sur la même carte pour le rallumer. Les migrations en attente sont rejouées, les assets republiés, et l’add-on reprend exactement là où il s’était arrêté.
Suppression
La suppression est définitive et détruit les données de l’add-on. Le bouton Supprimer n’apparaît que sur un add-on désactivé : la suppression se fait donc toujours en deux temps :
- Désactivez Appointments (voir Désinstallation).
- Cliquez sur Supprimer sur sa carte et confirmez la demande.
Le panneau d’administration, en une seule passe :
- exécute le hook de désinstallation de l’add-on, s’il en fournit un, tant que son code est encore sur le disque ;
- révoque les permissions déclarées dans son
addon.json; - annule ses migrations — ce qui supprime ses tables de base de données et toutes les lignes qu’elles contiennent — et purge ses entrées de la table
migrations, afin qu’une réinstallation ultérieure reparte de zéro ; - supprime ses assets publiés :
public/addons/appointment/,public/vendor/appointment/etstorage/app/public/addons/appointment/; - supprime le dossier de l’add-on
extensions/addons/appointment/; - supprime sa ligne dans la table
addons(le code d’achat enregistré disparaît avec elle) et vide le cache de l’application.
La suppression est refusée, avec un message explicatif et avant toute destruction, lorsque l’add-on est encore actif, lorsqu’un autre add-on actif en dépend, ou lorsque l’utilisateur du serveur web (PHP) ne peut pas supprimer extensions/addons/appointment/. Dans ce dernier cas, donnez à cet utilisateur le droit d’écriture sur le dossier et sur son parent, puis réessayez.
Supprimer le dossier en FTP ou en SSH n’est pas équivalent : les tables de l’add-on, ses entrées dans la table migrations et sa ligne addons restent en place, et sa carte reste dans la liste. Utilisez plutôt Supprimer dans le panneau d’administration.
Dépannage
Le calendrier n’affiche aucun jour disponible
- Assurez-vous qu’au moins un service actif existe.
- Si des prestataires sont configurés, vérifiez qu’au moins un prestataire a un horaire actif pour le jour de la semaine concerné.
- Vérifiez que
appointment_advance_daysest défini à une valeur supérieure à 0. - Vérifiez qu’aucune date bloquée globale ne couvre la période visible entière.
- Si aucun prestataire n’existe, le système utilise un horaire par défaut Lun–Ven : les week-ends s’afficheront comme indisponibles.
Aucun créneau horaire n’apparaît pour une date sélectionnée
- La date sélectionnée peut être dans le délai de
appointment_min_advance_hours(ex. : aujourd’hui avant la fenêtre de délai minimum). - Tous les créneaux peuvent être réservés. Vérifiez si
appointment_pending_blocks_slotest activé : les rendez-vous en attente comptent pour la capacité. - L’horaire du prestataire peut être défini comme indisponible pour ce jour de la semaine.
- Une date bloquée peut exister pour le prestataire ou globalement.
- La durée du service peut dépasser la fenêtre de temps disponible (ex. : service de 3 heures mais seulement 2 heures disponibles après la pause).
La page de rendez-vous retourne une erreur 404
- Assurez-vous que
appointment_enabledest défini surtruedans les paramètres. Le contrôleur retourne une 404 lorsque les rendez-vous sont désactivés. - Vérifiez que l’add-on est activé dans Admin → Add-ons.
La page de paiement n’affiche aucun moyen de paiement
- Assurez-vous qu’au moins un add-on de passerelle de paiement (Stripe, PayPal, Paddle ou MoMo) est installé et activé.
- Vérifiez que la passerelle est correctement configurée avec les clés API dans ses propres paramètres.
PaymentService::getAvailableGateways()ne retourne que les passerelles entièrement configurées.
Le client ne reçoit pas les e-mails de confirmation
- Vérifiez que
appointment_notify_client_on_appointmentest activé dans les paramètres. - Vérifiez que votre configuration mail fonctionne (SMTP, Mailgun, etc.) dans Admin → Paramètres → Mail.
- Les échecs de notification sont capturés silencieusement : consultez
storage/logs/laravel.logpour toute erreur.
Le mode multi-prestataires n’affiche pas le sélecteur de prestataire
- Assurez-vous que
appointment_multi_providerest activé dans les paramètres. - Vérifiez que
appointment_provider_selectionest également activé. - Vérifiez qu’au moins un prestataire actif existe et est attribué au service sélectionné.
Le CAPTCHA ne s’affiche pas sur le formulaire de rendez-vous
- Assurez-vous que
appointment_captcha_enabledest défini surtruedans les paramètres. - Vérifiez qu’un fournisseur CAPTCHA (reCAPTCHA, hCaptcha, etc.) est configuré dans Admin → Paramètres → Sécurité.
- Vérifiez que le pilote CAPTCHA est défini et que les clés API sont valides.
Les notifications de changement de statut ne s’envoient pas
- L’
AppointmentObservergère les notifications de changement de statut. Assurez-vous qu’il est enregistré dansAppointmentServiceProvider::boot(). - Seules les transitions vers Confirmé, Annulé ou Terminé déclenchent les notifications client.
- Les notifications d’annulation au prestataire nécessitent que le prestataire ait une adresse e-mail définie.
Rendez-vous v1.0.0 : fait partie de la plateforme CMS Larapen.
© BeDigit. Tous droits réservés.