import 'package:equatable/equatable.dart'; import '../../../domain/entities/evaluation_aide.dart'; /// Événements pour la gestion des évaluations d'aide /// /// Ces événements représentent toutes les actions possibles /// que l'utilisateur peut effectuer sur les évaluations d'aide. abstract class EvaluationsEvent extends Equatable { const EvaluationsEvent(); @override List get props => []; } /// Événement pour charger les évaluations class ChargerEvaluationsEvent extends EvaluationsEvent { final String? demandeId; final String? evaluateurId; final TypeEvaluateur? typeEvaluateur; final StatutAide? decision; final bool forceRefresh; const ChargerEvaluationsEvent({ this.demandeId, this.evaluateurId, this.typeEvaluateur, this.decision, this.forceRefresh = false, }); @override List get props => [ demandeId, evaluateurId, typeEvaluateur, decision, forceRefresh, ]; } /// Événement pour charger plus d'évaluations (pagination) class ChargerPlusEvaluationsEvent extends EvaluationsEvent { const ChargerPlusEvaluationsEvent(); } /// Événement pour créer une nouvelle évaluation class CreerEvaluationEvent extends EvaluationsEvent { final EvaluationAide evaluation; const CreerEvaluationEvent({required this.evaluation}); @override List get props => [evaluation]; } /// Événement pour mettre à jour une évaluation class MettreAJourEvaluationEvent extends EvaluationsEvent { final EvaluationAide evaluation; const MettreAJourEvaluationEvent({required this.evaluation}); @override List get props => [evaluation]; } /// Événement pour obtenir une évaluation spécifique class ObtenirEvaluationEvent extends EvaluationsEvent { final String evaluationId; const ObtenirEvaluationEvent({required this.evaluationId}); @override List get props => [evaluationId]; } /// Événement pour soumettre une évaluation class SoumettreEvaluationEvent extends EvaluationsEvent { final String evaluationId; const SoumettreEvaluationEvent({required this.evaluationId}); @override List get props => [evaluationId]; } /// Événement pour approuver une évaluation class ApprouverEvaluationEvent extends EvaluationsEvent { final String evaluationId; final String? commentaire; const ApprouverEvaluationEvent({ required this.evaluationId, this.commentaire, }); @override List get props => [evaluationId, commentaire]; } /// Événement pour rejeter une évaluation class RejeterEvaluationEvent extends EvaluationsEvent { final String evaluationId; final String motifRejet; const RejeterEvaluationEvent({ required this.evaluationId, required this.motifRejet, }); @override List get props => [evaluationId, motifRejet]; } /// Événement pour rechercher des évaluations class RechercherEvaluationsEvent extends EvaluationsEvent { final String? demandeId; final String? evaluateurId; final TypeEvaluateur? typeEvaluateur; final StatutAide? decision; final DateTime? dateDebut; final DateTime? dateFin; final double? noteMin; final double? noteMax; final String? motCle; final int page; final int taille; const RechercherEvaluationsEvent({ this.demandeId, this.evaluateurId, this.typeEvaluateur, this.decision, this.dateDebut, this.dateFin, this.noteMin, this.noteMax, this.motCle, this.page = 0, this.taille = 20, }); @override List get props => [ demandeId, evaluateurId, typeEvaluateur, decision, dateDebut, dateFin, noteMin, noteMax, motCle, page, taille, ]; } /// Événement pour charger mes évaluations class ChargerMesEvaluationsEvent extends EvaluationsEvent { final String evaluateurId; const ChargerMesEvaluationsEvent({required this.evaluateurId}); @override List get props => [evaluateurId]; } /// Événement pour charger les évaluations en attente class ChargerEvaluationsEnAttenteEvent extends EvaluationsEvent { final String? evaluateurId; final TypeEvaluateur? typeEvaluateur; const ChargerEvaluationsEnAttenteEvent({ this.evaluateurId, this.typeEvaluateur, }); @override List get props => [evaluateurId, typeEvaluateur]; } /// Événement pour valider une évaluation class ValiderEvaluationEvent extends EvaluationsEvent { final EvaluationAide evaluation; const ValiderEvaluationEvent({required this.evaluation}); @override List get props => [evaluation]; } /// Événement pour calculer la note globale class CalculerNoteGlobaleEvent extends EvaluationsEvent { final Map criteres; const CalculerNoteGlobaleEvent({required this.criteres}); @override List get props => [criteres]; } /// Événement pour filtrer les évaluations localement class FiltrerEvaluationsEvent extends EvaluationsEvent { final TypeEvaluateur? typeEvaluateur; final StatutAide? decision; final double? noteMin; final double? noteMax; final String? motCle; final DateTime? dateDebut; final DateTime? dateFin; const FiltrerEvaluationsEvent({ this.typeEvaluateur, this.decision, this.noteMin, this.noteMax, this.motCle, this.dateDebut, this.dateFin, }); @override List get props => [ typeEvaluateur, decision, noteMin, noteMax, motCle, dateDebut, dateFin, ]; } /// Événement pour trier les évaluations class TrierEvaluationsEvent extends EvaluationsEvent { final TriEvaluations critere; final bool croissant; const TrierEvaluationsEvent({ required this.critere, this.croissant = true, }); @override List get props => [critere, croissant]; } /// Événement pour rafraîchir les évaluations class RafraichirEvaluationsEvent extends EvaluationsEvent { const RafraichirEvaluationsEvent(); } /// Événement pour réinitialiser l'état class ReinitialiserEvaluationsEvent extends EvaluationsEvent { const ReinitialiserEvaluationsEvent(); } /// Événement pour sélectionner/désélectionner une évaluation class SelectionnerEvaluationEvent extends EvaluationsEvent { final String evaluationId; final bool selectionne; const SelectionnerEvaluationEvent({ required this.evaluationId, required this.selectionne, }); @override List get props => [evaluationId, selectionne]; } /// Événement pour sélectionner/désélectionner toutes les évaluations class SelectionnerToutesEvaluationsEvent extends EvaluationsEvent { final bool selectionne; const SelectionnerToutesEvaluationsEvent({required this.selectionne}); @override List get props => [selectionne]; } /// Événement pour supprimer des évaluations sélectionnées class SupprimerEvaluationsSelectionnees extends EvaluationsEvent { final List evaluationIds; const SupprimerEvaluationsSelectionnees({required this.evaluationIds}); @override List get props => [evaluationIds]; } /// Événement pour exporter des évaluations class ExporterEvaluationsEvent extends EvaluationsEvent { final List evaluationIds; final FormatExport format; const ExporterEvaluationsEvent({ required this.evaluationIds, required this.format, }); @override List get props => [evaluationIds, format]; } /// Événement pour obtenir les statistiques d'évaluation class ObtenirStatistiquesEvaluationEvent extends EvaluationsEvent { final String? evaluateurId; final DateTime? dateDebut; final DateTime? dateFin; const ObtenirStatistiquesEvaluationEvent({ this.evaluateurId, this.dateDebut, this.dateFin, }); @override List get props => [evaluateurId, dateDebut, dateFin]; } /// Événement pour signaler une évaluation class SignalerEvaluationEvent extends EvaluationsEvent { final String evaluationId; final String motifSignalement; final String? description; const SignalerEvaluationEvent({ required this.evaluationId, required this.motifSignalement, this.description, }); @override List get props => [evaluationId, motifSignalement, description]; } /// Énumération pour les critères de tri enum TriEvaluations { dateEvaluation, dateCreation, noteGlobale, decision, evaluateur, typeEvaluateur, demandeId, } /// Énumération pour les formats d'export enum FormatExport { pdf, excel, csv, json, } /// Extension pour obtenir le libellé des critères de tri extension TriEvaluationsExtension on TriEvaluations { String get libelle { switch (this) { case TriEvaluations.dateEvaluation: return 'Date d\'évaluation'; case TriEvaluations.dateCreation: return 'Date de création'; case TriEvaluations.noteGlobale: return 'Note globale'; case TriEvaluations.decision: return 'Décision'; case TriEvaluations.evaluateur: return 'Évaluateur'; case TriEvaluations.typeEvaluateur: return 'Type d\'évaluateur'; case TriEvaluations.demandeId: return 'Demande'; } } String get icone { switch (this) { case TriEvaluations.dateEvaluation: return 'calendar_today'; case TriEvaluations.dateCreation: return 'schedule'; case TriEvaluations.noteGlobale: return 'star'; case TriEvaluations.decision: return 'gavel'; case TriEvaluations.evaluateur: return 'person'; case TriEvaluations.typeEvaluateur: return 'badge'; case TriEvaluations.demandeId: return 'description'; } } } /// Extension pour obtenir le libellé des formats d'export extension FormatExportExtension on FormatExport { String get libelle { switch (this) { case FormatExport.pdf: return 'PDF'; case FormatExport.excel: return 'Excel'; case FormatExport.csv: return 'CSV'; case FormatExport.json: return 'JSON'; } } String get extension { switch (this) { case FormatExport.pdf: return '.pdf'; case FormatExport.excel: return '.xlsx'; case FormatExport.csv: return '.csv'; case FormatExport.json: return '.json'; } } String get mimeType { switch (this) { case FormatExport.pdf: return 'application/pdf'; case FormatExport.excel: return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; case FormatExport.csv: return 'text/csv'; case FormatExport.json: return 'application/json'; } } }