library analytics_model; import 'package:equatable/equatable.dart'; /// Modèle pour une métrique analytics — aligné avec AnalyticsDataDTO class AnalyticsModel extends Equatable { final String? id; final String typeMetrique; final String periodeAnalyse; final double valeur; final double? valeurPrecedente; final double? pourcentageEvolution; final DateTime? dateDebut; final DateTime? dateFin; final String? libelle; final String? description; final String? unite; final String? couleur; final String? icone; const AnalyticsModel({ this.id, required this.typeMetrique, required this.periodeAnalyse, required this.valeur, this.valeurPrecedente, this.pourcentageEvolution, this.dateDebut, this.dateFin, this.libelle, this.description, this.unite, this.couleur, this.icone, }); bool get hasPositiveTrend => pourcentageEvolution != null && pourcentageEvolution! > 0; bool get hasNegativeTrend => pourcentageEvolution != null && pourcentageEvolution! < 0; factory AnalyticsModel.fromJson(Map json) { return AnalyticsModel( id: json['id']?.toString(), typeMetrique: json['typeMetrique']?.toString() ?? '', periodeAnalyse: json['periodeAnalyse']?.toString() ?? '', valeur: _parseDouble(json['valeur']), valeurPrecedente: json['valeurPrecedente'] != null ? _parseDouble(json['valeurPrecedente']) : null, pourcentageEvolution: json['pourcentageEvolution'] != null ? _parseDouble(json['pourcentageEvolution']) : null, dateDebut: json['dateDebut'] != null ? DateTime.tryParse(json['dateDebut'].toString()) : null, dateFin: json['dateFin'] != null ? DateTime.tryParse(json['dateFin'].toString()) : null, libelle: json['libellePersonnalise']?.toString() ?? json['typeMetrique']?.toString(), description: json['description']?.toString(), unite: json['unite']?.toString(), couleur: json['couleur']?.toString(), icone: json['icone']?.toString(), ); } static double _parseDouble(dynamic val) { if (val == null) return 0.0; if (val is num) return val.toDouble(); return double.tryParse(val.toString()) ?? 0.0; } @override List get props => [id, typeMetrique, valeur, periodeAnalyse]; } /// KPI synthétique pour le tableau de bord des rapports class KpiModel extends Equatable { final String libelle; final double valeur; final String? unite; final double? evolution; final String? couleur; const KpiModel({ required this.libelle, required this.valeur, this.unite, this.evolution, this.couleur, }); factory KpiModel.fromJson(Map json) { return KpiModel( libelle: json['libelle']?.toString() ?? json['nom']?.toString() ?? '', valeur: AnalyticsModel._parseDouble(json['valeur'] ?? json['value']), unite: json['unite']?.toString(), evolution: json['evolution'] != null ? AnalyticsModel._parseDouble(json['evolution']) : null, couleur: json['couleur']?.toString(), ); } @override List get props => [libelle, valeur]; }