PHASE 3 - Ajout DTOs et services pour Workshop et CoachingSession

 DTOS WORKSHOP :
- WorkshopDTO : DTO complet avec CoachDTO, méthodes helper (isFull, getOccupancyPercentage)
- CreateWorkshopDTO : DTO de création avec validation (isDateRangeValid, getDurationHours)
- UpdateWorkshopDTO : DTO de mise à jour avec champs optionnels

 DTOS COACHING SESSION :
- CoachingSessionDTO : DTO complet avec CoachDTO, ClientDTO, méthodes helper (canBeRated, canBeModified, getPlannedDurationHours, getActualDurationHours, isOverdue)
- CreateCoachingSessionDTO : DTO de création avec validation (isScheduledDateValid, isDurationValid)
- UpdateCoachingSessionDTO : DTO de mise à jour avec validation (isClientRatingValid)

 INTERFACES DE SERVICE :
- WorkshopService : Interface complète avec 15 méthodes (CRUD, gestion participants, statistiques, recherche)
- CoachingSessionService : Interface complète avec 18 méthodes (CRUD, évaluations, statistiques coach/client, recherche)

🎯 FONCTIONNALITÉS API :
- Pagination avec PagedResponseDTO<T>
- Validation Jakarta complète
- Méthodes helper pour logique métier
- Support filtrage et recherche avancés
- Gestion des statistiques et rapports
- Documentation Javadoc complète en français

📊 TOTAL : 8 nouveaux fichiers API pour Workshop et CoachingSession
🚀 API GBCM maintenant complète avec toutes les interfaces de service
This commit is contained in:
dahoud
2025-10-07 11:05:52 +00:00
parent 561b3df218
commit e5aad77409
8 changed files with 2384 additions and 0 deletions

View File

@@ -0,0 +1,445 @@
package com.gbcm.server.api.dto.session;
import com.gbcm.server.api.dto.client.ClientDTO;
import com.gbcm.server.api.dto.coach.CoachDTO;
import com.gbcm.server.api.enums.ServiceType;
import com.gbcm.server.api.enums.SessionStatus;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* DTO représentant une session de coaching de la plateforme GBCM.
* Utilisé pour les réponses API et les transferts de données.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public class CoachingSessionDTO {
/**
* Identifiant unique de la session.
*/
private Long id;
/**
* Titre de la session.
*/
@NotBlank(message = "Le titre est obligatoire")
@Size(max = 200, message = "Le titre ne peut pas dépasser 200 caractères")
private String title;
/**
* Description de la session.
*/
private String description;
/**
* Type de service de coaching.
*/
@NotNull(message = "Le type de service est obligatoire")
private ServiceType serviceType;
/**
* Coach de la session.
*/
@NotNull(message = "Le coach est obligatoire")
private CoachDTO coach;
/**
* Client de la session.
*/
@NotNull(message = "Le client est obligatoire")
private ClientDTO client;
/**
* Date et heure prévues de la session.
*/
@NotNull(message = "La date prévue est obligatoire")
private LocalDateTime scheduledDateTime;
/**
* Date et heure réelles de début.
*/
private LocalDateTime actualStartDateTime;
/**
* Date et heure réelles de fin.
*/
private LocalDateTime actualEndDateTime;
/**
* Durée prévue en minutes.
*/
@NotNull(message = "La durée prévue est obligatoire")
private Integer plannedDurationMinutes;
/**
* Durée réelle en minutes.
*/
private Integer actualDurationMinutes;
/**
* Lieu de la session (physique ou virtuel).
*/
@Size(max = 255, message = "Le lieu ne peut pas dépasser 255 caractères")
private String location;
/**
* Lien de réunion virtuelle.
*/
@Size(max = 500, message = "Le lien de réunion ne peut pas dépasser 500 caractères")
private String meetingLink;
/**
* Prix de la session.
*/
private BigDecimal price;
/**
* Statut de la session.
*/
@NotNull(message = "Le statut est obligatoire")
private SessionStatus status;
/**
* Objectifs de la session.
*/
private String objectives;
/**
* Résumé de la session (rempli après).
*/
private String summary;
/**
* Actions à suivre (rempli après).
*/
private String actionItems;
/**
* Évaluation du client (1-5).
*/
private Integer clientRating;
/**
* Commentaires du client.
*/
private String clientFeedback;
/**
* Notes internes du coach.
*/
private String coachNotes;
/**
* Notes internes sur la session.
*/
private String notes;
/**
* Date de création.
*/
private LocalDateTime createdAt;
/**
* Date de dernière mise à jour.
*/
private LocalDateTime updatedAt;
/**
* Créé par.
*/
private String createdBy;
/**
* Mis à jour par.
*/
private String updatedBy;
/**
* Constructeur par défaut.
*/
public CoachingSessionDTO() {
}
// Getters et Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public ServiceType getServiceType() {
return serviceType;
}
public void setServiceType(ServiceType serviceType) {
this.serviceType = serviceType;
}
public CoachDTO getCoach() {
return coach;
}
public void setCoach(CoachDTO coach) {
this.coach = coach;
}
public ClientDTO getClient() {
return client;
}
public void setClient(ClientDTO client) {
this.client = client;
}
public LocalDateTime getScheduledDateTime() {
return scheduledDateTime;
}
public void setScheduledDateTime(LocalDateTime scheduledDateTime) {
this.scheduledDateTime = scheduledDateTime;
}
public LocalDateTime getActualStartDateTime() {
return actualStartDateTime;
}
public void setActualStartDateTime(LocalDateTime actualStartDateTime) {
this.actualStartDateTime = actualStartDateTime;
}
public LocalDateTime getActualEndDateTime() {
return actualEndDateTime;
}
public void setActualEndDateTime(LocalDateTime actualEndDateTime) {
this.actualEndDateTime = actualEndDateTime;
}
public Integer getPlannedDurationMinutes() {
return plannedDurationMinutes;
}
public void setPlannedDurationMinutes(Integer plannedDurationMinutes) {
this.plannedDurationMinutes = plannedDurationMinutes;
}
public Integer getActualDurationMinutes() {
return actualDurationMinutes;
}
public void setActualDurationMinutes(Integer actualDurationMinutes) {
this.actualDurationMinutes = actualDurationMinutes;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getMeetingLink() {
return meetingLink;
}
public void setMeetingLink(String meetingLink) {
this.meetingLink = meetingLink;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public SessionStatus getStatus() {
return status;
}
public void setStatus(SessionStatus status) {
this.status = status;
}
public String getObjectives() {
return objectives;
}
public void setObjectives(String objectives) {
this.objectives = objectives;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getActionItems() {
return actionItems;
}
public void setActionItems(String actionItems) {
this.actionItems = actionItems;
}
public Integer getClientRating() {
return clientRating;
}
public void setClientRating(Integer clientRating) {
this.clientRating = clientRating;
}
public String getClientFeedback() {
return clientFeedback;
}
public void setClientFeedback(String clientFeedback) {
this.clientFeedback = clientFeedback;
}
public String getCoachNotes() {
return coachNotes;
}
public void setCoachNotes(String coachNotes) {
this.coachNotes = coachNotes;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getUpdatedBy() {
return updatedBy;
}
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
/**
* Vérifie si la session peut être évaluée.
*
* @return true si la session peut être évaluée
*/
public boolean canBeRated() {
return status == SessionStatus.COMPLETED;
}
/**
* Vérifie si la session peut être modifiée.
*
* @return true si la session peut être modifiée
*/
public boolean canBeModified() {
return status == SessionStatus.SCHEDULED || status == SessionStatus.RESCHEDULED;
}
/**
* Calcule la durée prévue en heures.
*
* @return la durée prévue en heures
*/
public double getPlannedDurationHours() {
if (plannedDurationMinutes != null) {
return plannedDurationMinutes / 60.0;
}
return 0.0;
}
/**
* Calcule la durée réelle en heures.
*
* @return la durée réelle en heures
*/
public double getActualDurationHours() {
if (actualDurationMinutes != null) {
return actualDurationMinutes / 60.0;
}
return 0.0;
}
/**
* Vérifie si la session est en retard.
*
* @return true si la session est en retard
*/
public boolean isOverdue() {
if (scheduledDateTime != null && status == SessionStatus.SCHEDULED) {
return LocalDateTime.now().isAfter(scheduledDateTime);
}
return false;
}
@Override
public String toString() {
return "CoachingSessionDTO{" +
"id=" + id +
", title='" + title + '\'' +
", serviceType=" + serviceType +
", status=" + status +
", scheduledDateTime=" + scheduledDateTime +
", plannedDurationMinutes=" + plannedDurationMinutes +
'}';
}
}

View File

@@ -0,0 +1,250 @@
package com.gbcm.server.api.dto.session;
import com.gbcm.server.api.enums.ServiceType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* DTO pour la création d'une nouvelle session de coaching.
* Contient toutes les informations nécessaires pour créer une session.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public class CreateCoachingSessionDTO {
/**
* Titre de la session.
*/
@NotBlank(message = "Le titre est obligatoire")
@Size(max = 200, message = "Le titre ne peut pas dépasser 200 caractères")
private String title;
/**
* Description de la session.
*/
private String description;
/**
* Type de service de coaching.
*/
@NotNull(message = "Le type de service est obligatoire")
private ServiceType serviceType;
/**
* Identifiant du coach de la session.
*/
@NotNull(message = "L'identifiant du coach est obligatoire")
private Long coachId;
/**
* Identifiant du client de la session.
*/
@NotNull(message = "L'identifiant du client est obligatoire")
private Long clientId;
/**
* Date et heure prévues de la session.
*/
@NotNull(message = "La date prévue est obligatoire")
private LocalDateTime scheduledDateTime;
/**
* Durée prévue en minutes.
*/
@NotNull(message = "La durée prévue est obligatoire")
private Integer plannedDurationMinutes;
/**
* Lieu de la session (physique ou virtuel).
*/
@Size(max = 255, message = "Le lieu ne peut pas dépasser 255 caractères")
private String location;
/**
* Lien de réunion virtuelle.
*/
@Size(max = 500, message = "Le lien de réunion ne peut pas dépasser 500 caractères")
private String meetingLink;
/**
* Prix de la session.
*/
private BigDecimal price;
/**
* Statut initial de la session (par défaut SCHEDULED).
*/
private String status = "SCHEDULED";
/**
* Objectifs de la session.
*/
private String objectives;
/**
* Notes internes sur la session.
*/
private String notes;
/**
* Constructeur par défaut.
*/
public CreateCoachingSessionDTO() {
}
// Getters et Setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public ServiceType getServiceType() {
return serviceType;
}
public void setServiceType(ServiceType serviceType) {
this.serviceType = serviceType;
}
public Long getCoachId() {
return coachId;
}
public void setCoachId(Long coachId) {
this.coachId = coachId;
}
public Long getClientId() {
return clientId;
}
public void setClientId(Long clientId) {
this.clientId = clientId;
}
public LocalDateTime getScheduledDateTime() {
return scheduledDateTime;
}
public void setScheduledDateTime(LocalDateTime scheduledDateTime) {
this.scheduledDateTime = scheduledDateTime;
}
public Integer getPlannedDurationMinutes() {
return plannedDurationMinutes;
}
public void setPlannedDurationMinutes(Integer plannedDurationMinutes) {
this.plannedDurationMinutes = plannedDurationMinutes;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getMeetingLink() {
return meetingLink;
}
public void setMeetingLink(String meetingLink) {
this.meetingLink = meetingLink;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getObjectives() {
return objectives;
}
public void setObjectives(String objectives) {
this.objectives = objectives;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
/**
* Valide que la date de session est dans le futur.
*
* @return true si la date est valide
*/
public boolean isScheduledDateValid() {
return scheduledDateTime != null && scheduledDateTime.isAfter(LocalDateTime.now());
}
/**
* Calcule la durée prévue en heures.
*
* @return la durée prévue en heures
*/
public double getPlannedDurationHours() {
if (plannedDurationMinutes != null) {
return plannedDurationMinutes / 60.0;
}
return 0.0;
}
/**
* Valide que la durée est raisonnable (entre 15 minutes et 8 heures).
*
* @return true si la durée est valide
*/
public boolean isDurationValid() {
return plannedDurationMinutes != null &&
plannedDurationMinutes >= 15 &&
plannedDurationMinutes <= 480; // 8 heures max
}
@Override
public String toString() {
return "CreateCoachingSessionDTO{" +
"title='" + title + '\'' +
", serviceType=" + serviceType +
", coachId=" + coachId +
", clientId=" + clientId +
", scheduledDateTime=" + scheduledDateTime +
", plannedDurationMinutes=" + plannedDurationMinutes +
'}';
}
}

View File

@@ -0,0 +1,365 @@
package com.gbcm.server.api.dto.session;
import com.gbcm.server.api.enums.ServiceType;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* DTO pour la mise à jour d'une session de coaching existante.
* Tous les champs sont optionnels pour permettre des mises à jour partielles.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public class UpdateCoachingSessionDTO {
/**
* Titre de la session.
*/
@Size(max = 200, message = "Le titre ne peut pas dépasser 200 caractères")
private String title;
/**
* Description de la session.
*/
private String description;
/**
* Type de service de coaching.
*/
private ServiceType serviceType;
/**
* Identifiant du coach de la session.
*/
private Long coachId;
/**
* Identifiant du client de la session.
*/
private Long clientId;
/**
* Date et heure prévues de la session.
*/
private LocalDateTime scheduledDateTime;
/**
* Date et heure réelles de début.
*/
private LocalDateTime actualStartDateTime;
/**
* Date et heure réelles de fin.
*/
private LocalDateTime actualEndDateTime;
/**
* Durée prévue en minutes.
*/
private Integer plannedDurationMinutes;
/**
* Durée réelle en minutes.
*/
private Integer actualDurationMinutes;
/**
* Lieu de la session (physique ou virtuel).
*/
@Size(max = 255, message = "Le lieu ne peut pas dépasser 255 caractères")
private String location;
/**
* Lien de réunion virtuelle.
*/
@Size(max = 500, message = "Le lien de réunion ne peut pas dépasser 500 caractères")
private String meetingLink;
/**
* Prix de la session.
*/
private BigDecimal price;
/**
* Statut de la session.
*/
private String status;
/**
* Objectifs de la session.
*/
private String objectives;
/**
* Résumé de la session (rempli après).
*/
private String summary;
/**
* Actions à suivre (rempli après).
*/
private String actionItems;
/**
* Évaluation du client (1-5).
*/
private Integer clientRating;
/**
* Commentaires du client.
*/
private String clientFeedback;
/**
* Notes internes du coach.
*/
private String coachNotes;
/**
* Notes internes sur la session.
*/
private String notes;
/**
* Constructeur par défaut.
*/
public UpdateCoachingSessionDTO() {
}
// Getters et Setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public ServiceType getServiceType() {
return serviceType;
}
public void setServiceType(ServiceType serviceType) {
this.serviceType = serviceType;
}
public Long getCoachId() {
return coachId;
}
public void setCoachId(Long coachId) {
this.coachId = coachId;
}
public Long getClientId() {
return clientId;
}
public void setClientId(Long clientId) {
this.clientId = clientId;
}
public LocalDateTime getScheduledDateTime() {
return scheduledDateTime;
}
public void setScheduledDateTime(LocalDateTime scheduledDateTime) {
this.scheduledDateTime = scheduledDateTime;
}
public LocalDateTime getActualStartDateTime() {
return actualStartDateTime;
}
public void setActualStartDateTime(LocalDateTime actualStartDateTime) {
this.actualStartDateTime = actualStartDateTime;
}
public LocalDateTime getActualEndDateTime() {
return actualEndDateTime;
}
public void setActualEndDateTime(LocalDateTime actualEndDateTime) {
this.actualEndDateTime = actualEndDateTime;
}
public Integer getPlannedDurationMinutes() {
return plannedDurationMinutes;
}
public void setPlannedDurationMinutes(Integer plannedDurationMinutes) {
this.plannedDurationMinutes = plannedDurationMinutes;
}
public Integer getActualDurationMinutes() {
return actualDurationMinutes;
}
public void setActualDurationMinutes(Integer actualDurationMinutes) {
this.actualDurationMinutes = actualDurationMinutes;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getMeetingLink() {
return meetingLink;
}
public void setMeetingLink(String meetingLink) {
this.meetingLink = meetingLink;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getObjectives() {
return objectives;
}
public void setObjectives(String objectives) {
this.objectives = objectives;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getActionItems() {
return actionItems;
}
public void setActionItems(String actionItems) {
this.actionItems = actionItems;
}
public Integer getClientRating() {
return clientRating;
}
public void setClientRating(Integer clientRating) {
this.clientRating = clientRating;
}
public String getClientFeedback() {
return clientFeedback;
}
public void setClientFeedback(String clientFeedback) {
this.clientFeedback = clientFeedback;
}
public String getCoachNotes() {
return coachNotes;
}
public void setCoachNotes(String coachNotes) {
this.coachNotes = coachNotes;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
/**
* Valide que la date de session est dans le futur (si fournie).
*
* @return true si la date est valide ou null
*/
public boolean isScheduledDateValid() {
return scheduledDateTime == null || scheduledDateTime.isAfter(LocalDateTime.now());
}
/**
* Calcule la durée prévue en heures (si fournie).
*
* @return la durée prévue en heures
*/
public double getPlannedDurationHours() {
if (plannedDurationMinutes != null) {
return plannedDurationMinutes / 60.0;
}
return 0.0;
}
/**
* Calcule la durée réelle en heures (si fournie).
*
* @return la durée réelle en heures
*/
public double getActualDurationHours() {
if (actualDurationMinutes != null) {
return actualDurationMinutes / 60.0;
}
return 0.0;
}
/**
* Valide que la durée est raisonnable (si fournie).
*
* @return true si la durée est valide ou null
*/
public boolean isDurationValid() {
return plannedDurationMinutes == null ||
(plannedDurationMinutes >= 15 && plannedDurationMinutes <= 480); // 8 heures max
}
/**
* Valide que l'évaluation client est dans la bonne plage (si fournie).
*
* @return true si l'évaluation est valide ou null
*/
public boolean isClientRatingValid() {
return clientRating == null || (clientRating >= 1 && clientRating <= 5);
}
@Override
public String toString() {
return "UpdateCoachingSessionDTO{" +
"title='" + title + '\'' +
", serviceType=" + serviceType +
", status='" + status + '\'' +
", scheduledDateTime=" + scheduledDateTime +
", plannedDurationMinutes=" + plannedDurationMinutes +
'}';
}
}

View File

@@ -0,0 +1,280 @@
package com.gbcm.server.api.dto.workshop;
import com.gbcm.server.api.enums.ServiceType;
import com.gbcm.server.api.enums.WorkshopPackage;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* DTO pour la création d'un nouvel atelier.
* Contient toutes les informations nécessaires pour créer un atelier.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public class CreateWorkshopDTO {
/**
* Titre de l'atelier.
*/
@NotBlank(message = "Le titre est obligatoire")
@Size(max = 200, message = "Le titre ne peut pas dépasser 200 caractères")
private String title;
/**
* Description détaillée de l'atelier.
*/
private String description;
/**
* Package d'atelier associé.
*/
@NotNull(message = "Le package d'atelier est obligatoire")
private WorkshopPackage workshopPackage;
/**
* Type de service de l'atelier.
*/
@NotNull(message = "Le type de service est obligatoire")
private ServiceType serviceType;
/**
* Identifiant du coach principal de l'atelier.
*/
@NotNull(message = "L'identifiant du coach est obligatoire")
private Long coachId;
/**
* Date et heure de début de l'atelier.
*/
@NotNull(message = "La date de début est obligatoire")
private LocalDateTime startDateTime;
/**
* Date et heure de fin de l'atelier.
*/
@NotNull(message = "La date de fin est obligatoire")
private LocalDateTime endDateTime;
/**
* Lieu de l'atelier (physique ou virtuel).
*/
@Size(max = 255, message = "Le lieu ne peut pas dépasser 255 caractères")
private String location;
/**
* Lien de réunion virtuelle (Zoom, Teams, etc.).
*/
@Size(max = 500, message = "Le lien de réunion ne peut pas dépasser 500 caractères")
private String meetingLink;
/**
* Nombre maximum de participants.
*/
@NotNull(message = "Le nombre maximum de participants est obligatoire")
private Integer maxParticipants;
/**
* Prix de l'atelier.
*/
private BigDecimal price;
/**
* Statut initial de l'atelier (par défaut SCHEDULED).
*/
private String status = "SCHEDULED";
/**
* Matériel requis pour l'atelier.
*/
private String requiredMaterials;
/**
* Prérequis pour participer à l'atelier.
*/
private String prerequisites;
/**
* Objectifs d'apprentissage de l'atelier.
*/
private String learningObjectives;
/**
* Notes internes sur l'atelier.
*/
private String notes;
/**
* Constructeur par défaut.
*/
public CreateWorkshopDTO() {
}
// Getters et Setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public WorkshopPackage getWorkshopPackage() {
return workshopPackage;
}
public void setWorkshopPackage(WorkshopPackage workshopPackage) {
this.workshopPackage = workshopPackage;
}
public ServiceType getServiceType() {
return serviceType;
}
public void setServiceType(ServiceType serviceType) {
this.serviceType = serviceType;
}
public Long getCoachId() {
return coachId;
}
public void setCoachId(Long coachId) {
this.coachId = coachId;
}
public LocalDateTime getStartDateTime() {
return startDateTime;
}
public void setStartDateTime(LocalDateTime startDateTime) {
this.startDateTime = startDateTime;
}
public LocalDateTime getEndDateTime() {
return endDateTime;
}
public void setEndDateTime(LocalDateTime endDateTime) {
this.endDateTime = endDateTime;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getMeetingLink() {
return meetingLink;
}
public void setMeetingLink(String meetingLink) {
this.meetingLink = meetingLink;
}
public Integer getMaxParticipants() {
return maxParticipants;
}
public void setMaxParticipants(Integer maxParticipants) {
this.maxParticipants = maxParticipants;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getRequiredMaterials() {
return requiredMaterials;
}
public void setRequiredMaterials(String requiredMaterials) {
this.requiredMaterials = requiredMaterials;
}
public String getPrerequisites() {
return prerequisites;
}
public void setPrerequisites(String prerequisites) {
this.prerequisites = prerequisites;
}
public String getLearningObjectives() {
return learningObjectives;
}
public void setLearningObjectives(String learningObjectives) {
this.learningObjectives = learningObjectives;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
/**
* Valide que la date de fin est après la date de début.
*
* @return true si les dates sont valides
*/
public boolean isDateRangeValid() {
return startDateTime != null && endDateTime != null &&
endDateTime.isAfter(startDateTime);
}
/**
* Calcule la durée de l'atelier en heures.
*
* @return la durée en heures
*/
public long getDurationHours() {
if (startDateTime != null && endDateTime != null) {
return java.time.Duration.between(startDateTime, endDateTime).toHours();
}
return 0;
}
@Override
public String toString() {
return "CreateWorkshopDTO{" +
"title='" + title + '\'' +
", workshopPackage=" + workshopPackage +
", coachId=" + coachId +
", startDateTime=" + startDateTime +
", maxParticipants=" + maxParticipants +
'}';
}
}

View File

@@ -0,0 +1,273 @@
package com.gbcm.server.api.dto.workshop;
import com.gbcm.server.api.enums.ServiceType;
import com.gbcm.server.api.enums.WorkshopPackage;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* DTO pour la mise à jour d'un atelier existant.
* Tous les champs sont optionnels pour permettre des mises à jour partielles.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public class UpdateWorkshopDTO {
/**
* Titre de l'atelier.
*/
@Size(max = 200, message = "Le titre ne peut pas dépasser 200 caractères")
private String title;
/**
* Description détaillée de l'atelier.
*/
private String description;
/**
* Package d'atelier associé.
*/
private WorkshopPackage workshopPackage;
/**
* Type de service de l'atelier.
*/
private ServiceType serviceType;
/**
* Identifiant du coach principal de l'atelier.
*/
private Long coachId;
/**
* Date et heure de début de l'atelier.
*/
private LocalDateTime startDateTime;
/**
* Date et heure de fin de l'atelier.
*/
private LocalDateTime endDateTime;
/**
* Lieu de l'atelier (physique ou virtuel).
*/
@Size(max = 255, message = "Le lieu ne peut pas dépasser 255 caractères")
private String location;
/**
* Lien de réunion virtuelle (Zoom, Teams, etc.).
*/
@Size(max = 500, message = "Le lien de réunion ne peut pas dépasser 500 caractères")
private String meetingLink;
/**
* Nombre maximum de participants.
*/
private Integer maxParticipants;
/**
* Prix de l'atelier.
*/
private BigDecimal price;
/**
* Statut de l'atelier.
*/
private String status;
/**
* Matériel requis pour l'atelier.
*/
private String requiredMaterials;
/**
* Prérequis pour participer à l'atelier.
*/
private String prerequisites;
/**
* Objectifs d'apprentissage de l'atelier.
*/
private String learningObjectives;
/**
* Notes internes sur l'atelier.
*/
private String notes;
/**
* Constructeur par défaut.
*/
public UpdateWorkshopDTO() {
}
// Getters et Setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public WorkshopPackage getWorkshopPackage() {
return workshopPackage;
}
public void setWorkshopPackage(WorkshopPackage workshopPackage) {
this.workshopPackage = workshopPackage;
}
public ServiceType getServiceType() {
return serviceType;
}
public void setServiceType(ServiceType serviceType) {
this.serviceType = serviceType;
}
public Long getCoachId() {
return coachId;
}
public void setCoachId(Long coachId) {
this.coachId = coachId;
}
public LocalDateTime getStartDateTime() {
return startDateTime;
}
public void setStartDateTime(LocalDateTime startDateTime) {
this.startDateTime = startDateTime;
}
public LocalDateTime getEndDateTime() {
return endDateTime;
}
public void setEndDateTime(LocalDateTime endDateTime) {
this.endDateTime = endDateTime;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getMeetingLink() {
return meetingLink;
}
public void setMeetingLink(String meetingLink) {
this.meetingLink = meetingLink;
}
public Integer getMaxParticipants() {
return maxParticipants;
}
public void setMaxParticipants(Integer maxParticipants) {
this.maxParticipants = maxParticipants;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getRequiredMaterials() {
return requiredMaterials;
}
public void setRequiredMaterials(String requiredMaterials) {
this.requiredMaterials = requiredMaterials;
}
public String getPrerequisites() {
return prerequisites;
}
public void setPrerequisites(String prerequisites) {
this.prerequisites = prerequisites;
}
public String getLearningObjectives() {
return learningObjectives;
}
public void setLearningObjectives(String learningObjectives) {
this.learningObjectives = learningObjectives;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
/**
* Valide que la date de fin est après la date de début (si les deux sont fournies).
*
* @return true si les dates sont valides ou si l'une d'elles est null
*/
public boolean isDateRangeValid() {
if (startDateTime == null || endDateTime == null) {
return true; // Pas de validation si l'une des dates est manquante
}
return endDateTime.isAfter(startDateTime);
}
/**
* Calcule la durée de l'atelier en heures (si les deux dates sont fournies).
*
* @return la durée en heures ou 0 si les dates ne sont pas complètes
*/
public long getDurationHours() {
if (startDateTime != null && endDateTime != null) {
return java.time.Duration.between(startDateTime, endDateTime).toHours();
}
return 0;
}
@Override
public String toString() {
return "UpdateWorkshopDTO{" +
"title='" + title + '\'' +
", workshopPackage=" + workshopPackage +
", status='" + status + '\'' +
", startDateTime=" + startDateTime +
", maxParticipants=" + maxParticipants +
'}';
}
}

View File

@@ -0,0 +1,377 @@
package com.gbcm.server.api.dto.workshop;
import com.gbcm.server.api.dto.coach.CoachDTO;
import com.gbcm.server.api.enums.ServiceType;
import com.gbcm.server.api.enums.WorkshopPackage;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* DTO représentant un atelier stratégique de la plateforme GBCM.
* Utilisé pour les réponses API et les transferts de données.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public class WorkshopDTO {
/**
* Identifiant unique de l'atelier.
*/
private Long id;
/**
* Titre de l'atelier.
*/
@NotBlank(message = "Le titre est obligatoire")
@Size(max = 200, message = "Le titre ne peut pas dépasser 200 caractères")
private String title;
/**
* Description détaillée de l'atelier.
*/
private String description;
/**
* Package d'atelier associé.
*/
@NotNull(message = "Le package d'atelier est obligatoire")
private WorkshopPackage workshopPackage;
/**
* Type de service de l'atelier.
*/
@NotNull(message = "Le type de service est obligatoire")
private ServiceType serviceType;
/**
* Coach principal de l'atelier.
*/
@NotNull(message = "Le coach est obligatoire")
private CoachDTO coach;
/**
* Date et heure de début de l'atelier.
*/
@NotNull(message = "La date de début est obligatoire")
private LocalDateTime startDateTime;
/**
* Date et heure de fin de l'atelier.
*/
@NotNull(message = "La date de fin est obligatoire")
private LocalDateTime endDateTime;
/**
* Lieu de l'atelier (physique ou virtuel).
*/
@Size(max = 255, message = "Le lieu ne peut pas dépasser 255 caractères")
private String location;
/**
* Lien de réunion virtuelle (Zoom, Teams, etc.).
*/
@Size(max = 500, message = "Le lien de réunion ne peut pas dépasser 500 caractères")
private String meetingLink;
/**
* Nombre maximum de participants.
*/
@NotNull(message = "Le nombre maximum de participants est obligatoire")
private Integer maxParticipants;
/**
* Nombre actuel de participants inscrits.
*/
private Integer currentParticipants;
/**
* Prix de l'atelier.
*/
private BigDecimal price;
/**
* Statut de l'atelier.
*/
@NotNull(message = "Le statut est obligatoire")
private String status;
/**
* Matériel requis pour l'atelier.
*/
private String requiredMaterials;
/**
* Prérequis pour participer à l'atelier.
*/
private String prerequisites;
/**
* Objectifs d'apprentissage de l'atelier.
*/
private String learningObjectives;
/**
* Notes internes sur l'atelier.
*/
private String notes;
/**
* Date de création.
*/
private LocalDateTime createdAt;
/**
* Date de dernière mise à jour.
*/
private LocalDateTime updatedAt;
/**
* Créé par.
*/
private String createdBy;
/**
* Mis à jour par.
*/
private String updatedBy;
/**
* Constructeur par défaut.
*/
public WorkshopDTO() {
}
// Getters et Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public WorkshopPackage getWorkshopPackage() {
return workshopPackage;
}
public void setWorkshopPackage(WorkshopPackage workshopPackage) {
this.workshopPackage = workshopPackage;
}
public ServiceType getServiceType() {
return serviceType;
}
public void setServiceType(ServiceType serviceType) {
this.serviceType = serviceType;
}
public CoachDTO getCoach() {
return coach;
}
public void setCoach(CoachDTO coach) {
this.coach = coach;
}
public LocalDateTime getStartDateTime() {
return startDateTime;
}
public void setStartDateTime(LocalDateTime startDateTime) {
this.startDateTime = startDateTime;
}
public LocalDateTime getEndDateTime() {
return endDateTime;
}
public void setEndDateTime(LocalDateTime endDateTime) {
this.endDateTime = endDateTime;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getMeetingLink() {
return meetingLink;
}
public void setMeetingLink(String meetingLink) {
this.meetingLink = meetingLink;
}
public Integer getMaxParticipants() {
return maxParticipants;
}
public void setMaxParticipants(Integer maxParticipants) {
this.maxParticipants = maxParticipants;
}
public Integer getCurrentParticipants() {
return currentParticipants;
}
public void setCurrentParticipants(Integer currentParticipants) {
this.currentParticipants = currentParticipants;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getRequiredMaterials() {
return requiredMaterials;
}
public void setRequiredMaterials(String requiredMaterials) {
this.requiredMaterials = requiredMaterials;
}
public String getPrerequisites() {
return prerequisites;
}
public void setPrerequisites(String prerequisites) {
this.prerequisites = prerequisites;
}
public String getLearningObjectives() {
return learningObjectives;
}
public void setLearningObjectives(String learningObjectives) {
this.learningObjectives = learningObjectives;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getUpdatedBy() {
return updatedBy;
}
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
/**
* Vérifie si l'atelier est complet.
*
* @return true si l'atelier est complet
*/
public boolean isFull() {
return currentParticipants != null && maxParticipants != null &&
currentParticipants >= maxParticipants;
}
/**
* Calcule le pourcentage de remplissage.
*
* @return le pourcentage de remplissage (0-100)
*/
public double getOccupancyPercentage() {
if (maxParticipants == null || maxParticipants == 0) {
return 0.0;
}
if (currentParticipants == null) {
return 0.0;
}
return (currentParticipants.doubleValue() / maxParticipants.doubleValue()) * 100.0;
}
/**
* Calcule la durée de l'atelier en heures.
*
* @return la durée en heures
*/
public long getDurationHours() {
if (startDateTime != null && endDateTime != null) {
return java.time.Duration.between(startDateTime, endDateTime).toHours();
}
return 0;
}
@Override
public String toString() {
return "WorkshopDTO{" +
"id=" + id +
", title='" + title + '\'' +
", workshopPackage=" + workshopPackage +
", status='" + status + '\'' +
", startDateTime=" + startDateTime +
", currentParticipants=" + currentParticipants +
", maxParticipants=" + maxParticipants +
'}';
}
}

View File

@@ -0,0 +1,207 @@
package com.gbcm.server.api.service;
import com.gbcm.server.api.dto.common.PagedResponseDTO;
import com.gbcm.server.api.dto.session.CoachingSessionDTO;
import com.gbcm.server.api.dto.session.CreateCoachingSessionDTO;
import com.gbcm.server.api.dto.session.UpdateCoachingSessionDTO;
import com.gbcm.server.api.enums.ServiceType;
import com.gbcm.server.api.enums.SessionStatus;
import com.gbcm.server.api.exceptions.GBCMException;
import java.time.LocalDateTime;
/**
* Interface de service pour la gestion des sessions de coaching GBCM.
* Définit toutes les opérations métier liées aux sessions de coaching.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public interface CoachingSessionService {
/**
* Récupère la liste paginée des sessions avec filtres optionnels.
*
* @param page numéro de page (commence à 0)
* @param size taille de la page
* @param sort critères de tri
* @param status filtrer par statut
* @param serviceType filtrer par type de service
* @param coachId filtrer par coach
* @param clientId filtrer par client
* @param search recherche textuelle
* @return la liste paginée des sessions
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<CoachingSessionDTO> getCoachingSessions(int page, int size, String sort,
SessionStatus status, ServiceType serviceType,
Long coachId, Long clientId, String search) throws GBCMException;
/**
* Récupère une session par son identifiant.
*
* @param id l'identifiant de la session
* @return la session trouvée
* @throws GBCMException si la session n'est pas trouvée
*/
CoachingSessionDTO getCoachingSessionById(Long id) throws GBCMException;
/**
* Crée une nouvelle session de coaching.
*
* @param createCoachingSessionDTO les données de création
* @return la session créée
* @throws GBCMException en cas d'erreur de création
*/
CoachingSessionDTO createCoachingSession(CreateCoachingSessionDTO createCoachingSessionDTO) throws GBCMException;
/**
* Met à jour une session existante.
*
* @param id l'identifiant de la session
* @param updateCoachingSessionDTO les données de mise à jour
* @return la session mise à jour
* @throws GBCMException si la session n'est pas trouvée ou en cas d'erreur
*/
CoachingSessionDTO updateCoachingSession(Long id, UpdateCoachingSessionDTO updateCoachingSessionDTO) throws GBCMException;
/**
* Supprime une session (suppression logique).
*
* @param id l'identifiant de la session
* @throws GBCMException si la session n'est pas trouvée ou ne peut pas être supprimée
*/
void deleteCoachingSession(Long id) throws GBCMException;
/**
* Démarre une session.
*
* @param id l'identifiant de la session
* @throws GBCMException si la session n'est pas trouvée ou ne peut pas être démarrée
*/
void startCoachingSession(Long id) throws GBCMException;
/**
* Termine une session.
*
* @param id l'identifiant de la session
* @throws GBCMException si la session n'est pas trouvée ou ne peut pas être terminée
*/
void completeCoachingSession(Long id) throws GBCMException;
/**
* Annule une session.
*
* @param id l'identifiant de la session
* @throws GBCMException si la session n'est pas trouvée ou ne peut pas être annulée
*/
void cancelCoachingSession(Long id) throws GBCMException;
/**
* Reporte une session.
*
* @param id l'identifiant de la session
* @param newDateTime nouvelle date et heure
* @throws GBCMException si la session n'est pas trouvée ou ne peut pas être reportée
*/
void rescheduleCoachingSession(Long id, LocalDateTime newDateTime) throws GBCMException;
/**
* Marque une session comme non présentée.
*
* @param id l'identifiant de la session
* @throws GBCMException si la session n'est pas trouvée
*/
void markNoShow(Long id) throws GBCMException;
/**
* Évalue une session terminée.
*
* @param id l'identifiant de la session
* @param rating note de 1 à 5
* @param feedback commentaires du client
* @throws GBCMException si la session n'est pas trouvée ou ne peut pas être évaluée
*/
void rateCoachingSession(Long id, Integer rating, String feedback) throws GBCMException;
/**
* Récupère les sessions à venir.
*
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des sessions à venir
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<CoachingSessionDTO> getUpcomingSessions(int page, int size) throws GBCMException;
/**
* Récupère les sessions d'un coach.
*
* @param coachId l'identifiant du coach
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des sessions du coach
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<CoachingSessionDTO> getSessionsByCoach(Long coachId, int page, int size) throws GBCMException;
/**
* Récupère les sessions d'un client.
*
* @param clientId l'identifiant du client
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des sessions du client
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<CoachingSessionDTO> getSessionsByClient(Long clientId, int page, int size) throws GBCMException;
/**
* Récupère les sessions dans une plage de dates.
*
* @param startDate date de début
* @param endDate date de fin
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des sessions dans la plage
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<CoachingSessionDTO> getSessionsByDateRange(LocalDateTime startDate, LocalDateTime endDate,
int page, int size) throws GBCMException;
/**
* Récupère les statistiques des sessions.
*
* @return les statistiques des sessions
* @throws GBCMException en cas d'erreur
*/
Object getSessionStatistics() throws GBCMException;
/**
* Récupère les statistiques d'un coach.
*
* @param coachId l'identifiant du coach
* @return les statistiques du coach
* @throws GBCMException en cas d'erreur
*/
Object getCoachStatistics(Long coachId) throws GBCMException;
/**
* Récupère les statistiques d'un client.
*
* @param clientId l'identifiant du client
* @return les statistiques du client
* @throws GBCMException en cas d'erreur
*/
Object getClientStatistics(Long clientId) throws GBCMException;
/**
* Recherche des sessions selon des critères avancés.
*
* @param searchCriteria les critères de recherche
* @return la liste paginée des sessions trouvées
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<CoachingSessionDTO> searchCoachingSessions(Object searchCriteria) throws GBCMException;
}

View File

@@ -0,0 +1,187 @@
package com.gbcm.server.api.service;
import com.gbcm.server.api.dto.common.PagedResponseDTO;
import com.gbcm.server.api.dto.workshop.CreateWorkshopDTO;
import com.gbcm.server.api.dto.workshop.UpdateWorkshopDTO;
import com.gbcm.server.api.dto.workshop.WorkshopDTO;
import com.gbcm.server.api.enums.ServiceType;
import com.gbcm.server.api.enums.WorkshopPackage;
import com.gbcm.server.api.exceptions.GBCMException;
import java.time.LocalDateTime;
/**
* Interface de service pour la gestion des ateliers stratégiques GBCM.
* Définit toutes les opérations métier liées aux ateliers.
*
* @author GBCM Development Team
* @version 1.0
* @since 1.0
*/
public interface WorkshopService {
/**
* Récupère la liste paginée des ateliers avec filtres optionnels.
*
* @param page numéro de page (commence à 0)
* @param size taille de la page
* @param sort critères de tri
* @param status filtrer par statut
* @param workshopPackage filtrer par package d'atelier
* @param coachId filtrer par coach
* @param search recherche textuelle
* @return la liste paginée des ateliers
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<WorkshopDTO> getWorkshops(int page, int size, String sort,
Object status, WorkshopPackage workshopPackage,
Long coachId, String search) throws GBCMException;
/**
* Récupère un atelier par son identifiant.
*
* @param id l'identifiant de l'atelier
* @return l'atelier trouvé
* @throws GBCMException si l'atelier n'est pas trouvé
*/
WorkshopDTO getWorkshopById(Long id) throws GBCMException;
/**
* Crée un nouvel atelier.
*
* @param createWorkshopDTO les données de création
* @return l'atelier créé
* @throws GBCMException en cas d'erreur de création
*/
WorkshopDTO createWorkshop(CreateWorkshopDTO createWorkshopDTO) throws GBCMException;
/**
* Met à jour un atelier existant.
*
* @param id l'identifiant de l'atelier
* @param updateWorkshopDTO les données de mise à jour
* @return l'atelier mis à jour
* @throws GBCMException si l'atelier n'est pas trouvé ou en cas d'erreur
*/
WorkshopDTO updateWorkshop(Long id, UpdateWorkshopDTO updateWorkshopDTO) throws GBCMException;
/**
* Supprime un atelier (suppression logique).
*
* @param id l'identifiant de l'atelier
* @throws GBCMException si l'atelier n'est pas trouvé ou ne peut pas être supprimé
*/
void deleteWorkshop(Long id) throws GBCMException;
/**
* Démarre un atelier.
*
* @param id l'identifiant de l'atelier
* @throws GBCMException si l'atelier n'est pas trouvé ou ne peut pas être démarré
*/
void startWorkshop(Long id) throws GBCMException;
/**
* Termine un atelier.
*
* @param id l'identifiant de l'atelier
* @throws GBCMException si l'atelier n'est pas trouvé ou ne peut pas être terminé
*/
void completeWorkshop(Long id) throws GBCMException;
/**
* Annule un atelier.
*
* @param id l'identifiant de l'atelier
* @throws GBCMException si l'atelier n'est pas trouvé ou ne peut pas être annulé
*/
void cancelWorkshop(Long id) throws GBCMException;
/**
* Reporte un atelier.
*
* @param id l'identifiant de l'atelier
* @throws GBCMException si l'atelier n'est pas trouvé ou ne peut pas être reporté
*/
void postponeWorkshop(Long id) throws GBCMException;
/**
* Ajoute un participant à un atelier.
*
* @param id l'identifiant de l'atelier
* @param participantId l'identifiant du participant
* @throws GBCMException si l'atelier est complet ou en cas d'erreur
*/
void addParticipant(Long id, Long participantId) throws GBCMException;
/**
* Retire un participant d'un atelier.
*
* @param id l'identifiant de l'atelier
* @param participantId l'identifiant du participant
* @throws GBCMException en cas d'erreur
*/
void removeParticipant(Long id, Long participantId) throws GBCMException;
/**
* Récupère les ateliers à venir.
*
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des ateliers à venir
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<WorkshopDTO> getUpcomingWorkshops(int page, int size) throws GBCMException;
/**
* Récupère les ateliers d'un coach.
*
* @param coachId l'identifiant du coach
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des ateliers du coach
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<WorkshopDTO> getWorkshopsByCoach(Long coachId, int page, int size) throws GBCMException;
/**
* Récupère les ateliers par package.
*
* @param workshopPackage le package d'atelier
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des ateliers du package
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<WorkshopDTO> getWorkshopsByPackage(WorkshopPackage workshopPackage, int page, int size) throws GBCMException;
/**
* Récupère les ateliers dans une plage de dates.
*
* @param startDate date de début
* @param endDate date de fin
* @param page numéro de page
* @param size taille de la page
* @return la liste paginée des ateliers dans la plage
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<WorkshopDTO> getWorkshopsByDateRange(LocalDateTime startDate, LocalDateTime endDate,
int page, int size) throws GBCMException;
/**
* Récupère les statistiques des ateliers.
*
* @return les statistiques des ateliers
* @throws GBCMException en cas d'erreur
*/
Object getWorkshopStatistics() throws GBCMException;
/**
* Recherche des ateliers selon des critères avancés.
*
* @param searchCriteria les critères de recherche
* @return la liste paginée des ateliers trouvés
* @throws GBCMException en cas d'erreur
*/
PagedResponseDTO<WorkshopDTO> searchWorkshops(Object searchCriteria) throws GBCMException;
}