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+
Optionnel : pour activer la collecte de paiement avant la confirmation de rendez-vous, installez et activez au moins un add-on de passerelle de paiement (Stripe, PayPal, Paddle ou MoMo).

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 → DownloadsLicense certificate & purchase code
Vérifiez votre dossier de spam. Pour les achats effectués sur la Boutique bedigit.com comme sur Gumroad, le code d’achat est envoyé par e-mail. Les e-mails de licence automatisés sont très souvent filtrés : si le message n’est pas dans votre boîte de réception, regardez dans votre dossier spam / courrier indésirable avant de contacter le support, et ajoutez notre adresse d’expédition à vos contacts ou à votre liste d’autorisation.

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?
Vous avez perdu votre code d’achat ? Recherchez dans votre boîte mail (dossier de spam inclus) les termes “licence” ou “code d’achat”, puis consultez Mon compte → Mes licences sur bedigit.com pour les achats Boutique et Gumroad, ou Downloads → License certificate sur Envato. S’il est toujours introuvable, ouvrez un ticket sur notre Centre d’aide en indiquant votre numéro de commande (Boutique), l’identifiant de vente Gumroad ou l’e-mail de l’acheteur (Gumroad), ou votre nom d’utilisateur Envato et le nom de l’article (Envato).

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
Notifications de changement de statut : lorsqu’un statut passe à Confirmé, Annulé ou Terminé, le client reçoit automatiquement un e-mail (si 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éthodeURLNom de routeDescription
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

  1. Choisir un service : grille de cartes des services actifs affichant le nom, la description, la durée et le prix.
  2. Choisir un prestataire : affiché uniquement si le mode multi-prestataires est activé. Inclut une option “Tout prestataire disponible”.
  3. Choisir la date & l’heure : calendrier interactif affichant les jours disponibles/indisponibles. Sélectionner une date charge les créneaux horaires via AJAX.
  4. Vos coordonnées : nom, e-mail, téléphone (optionnel), notes (optionnel). Pré-rempli pour les utilisateurs authentifiés.
  5. 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 :

GET /{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
GET /{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 :

  1. Charger l’horaire du prestataire pour le jour de la semaine demandé.
  2. Vérifier les dates bloquées (spécifiques au prestataire et globales).
  3. Générer les créneaux de start_time à end_time aux intervalles de slot_interval (ou de la durée du service).
  4. Exclure les créneaux qui chevauchent la fenêtre de pause.
  5. Exclure les créneaux antérieurs au délai minimum de réservation.
  6. Pour chaque créneau candidat, compter les rendez-vous bloquants existants (confirmés + terminés, et en attente si pending_blocks_slot est activé).
  7. 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éthodeURLNom de routeDescription
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 total
  • getPayableCurrency() : depuis la devise du service ou la devise par défaut du site
  • getPayableDescription() : 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 confirmation
  • getPaymentCancelUrl() : 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
Note : si aucun add-on de passerelle de paiement n’est actif alors que 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_id ou client_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
Piloté par l’Observer : les notifications de changement de statut et d’annulation sont déclenchées par l’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é)

  1. Téléchargez le dernier fichier .zip de cet add-on.
  2. Allez dans Panneau d’administrationAdd-ons et cliquez sur le bouton Télécharger.
  3. Sélectionnez ou glissez le fichier .zip dans la zone de téléchargement.
  4. Une invite de confirmation affichera les numéros de version actuel et nouveau. Cliquez sur Remplacer pour continuer.
  5. Allez dans Panneau d’administrationMise à 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
Sauvegardez d’abord : sauvegardez toujours votre base de données avant d’exécuter des migrations sur un système de production.

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 :

  1. Désactivez Appointments (voir Désinstallation).
  2. 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/ et storage/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.
Cette action est irréversible. Sauvegardez votre base de données avant de supprimer un add-on dont les données peuvent encore vous servir : le réinstaller plus tard crée des tables vides, pas votre ancien contenu.

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_days est 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_slot est 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_enabled est défini sur true dans 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_appointment est 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.log pour toute erreur.

Le mode multi-prestataires n’affiche pas le sélecteur de prestataire

  • Assurez-vous que appointment_multi_provider est activé dans les paramètres.
  • Vérifiez que appointment_provider_selection est é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_enabled est défini sur true dans 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’AppointmentObserver gère les notifications de changement de statut. Assurez-vous qu’il est enregistré dans AppointmentServiceProvider::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.

Cet article vous a-t-il été utile ?

Merci pour votre retour !

Besoin d'aide ? Créez un ticket de support

Créer un Ticket